gpt4 book ai didi

c# - ICommand Execute() 任务.ContinueWith()

转载 作者:行者123 更新时间:2023-11-30 14:50:33 29 4
gpt4 key购买 nike

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
);
}

我的问题是

  1. 调用 ICommend Execute() 的线程是 UI 线程吗?
  2. 请问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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com