在Execute()
实现 ICommand
的类的在 WPF 应用程序中,我有一个对返回 Task
的方法的外部调用
ICommand 类:
public static void Execute(object parameter)
{
Cancel(arg1, arg2);
}
private static void Cancel(IList<object> arg1, object arg2)
{
Task<object> cancelTask = service.AmendAsync
(
CancelTokenSource.Token,
object arg2
);
ProcessCancellingResponse(arg1, arg2);
}
private static void ProcessCancellingResponse(IList<object> arg1, Task<object> cancelTask)
{
cancelTask.ContinueWith
(
task =>
{
Update(task.Result.Response);
},
CancelTokenSource.Token,
TaskContinuationOptions.AttachedToParent | TaskContinuationOptions.OnlyOnRanToCompletion,
TaskScheduler.FromCurrentSynchronizationContext()
);
}
服务等级:
public Task<object> AmendAsync(CancellationToken cancellationToken, object arg1)
{
return Task<object>.Factory.StartNew
(
() =>
{
...
},
cancellationToken,
TaskCreationOptions.None,
TaskScheduler.Default
);
}
我的问题是
- 调用 ICommend Execute() 的线程是 UI 线程吗?
- 请问
cancelTask.ContinueWith()
在 UI 线程或后台线程上等待?即如果Task
需要很长时间并且它正在等待 UI 线程,UI 可能会卡住。
最佳答案
根据 Domysee 的评论,我会在这里说清楚,Execute
总是 在 UI 线程中运行,但您可以在回调中执行任何您想要的操作,包括运行后台线程,
关于继续,如果你不明确告诉他 on with thread 继续,它将在 TaskScheduler.Current
上完成它的工作,否则,它将继续在你定义的调度器上。
无论如何考虑使用async\await
with\out capturing 来做一个延续
await Task.Run(() => ).ConfigureAwait(true);
await Task.Run(() => ).ConfigureAwait(false);
更新
根据问题更新,
执行-> UI线程
取消 => UI线程
AmendAsync => 后台线程
ContinueWith => UI线程(因为你写了FromCurrentSynchronizationContext
)
关于c# - ICommand Execute() 任务.ContinueWith(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36283596/