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

标签 c# wpf multithreading task

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/

相关文章:

c# - 检查所选日期是否在预定义假期的三天内

c# - 为什么路径由字符串表示而不是单独的类?

java - 示例案例的建议锁

c# - XNA Tile 映射平台游戏?

c# - 压缩 MP4 文件

c# - DependencyProperty 的 RegisterAttached() 和 Register() 中的不同行为

wpf - IDataErrorInfo 最佳实践

wpf - 在WPF MVVM项目的解决方案资源管理器中移动XAML文件

java - Java Spring Async性能

java - 在java中,守护线程在主线程退出后是否可以继续?