C# 来自UI的并行任务等待,无阻塞

C# 来自UI的并行任务等待,无阻塞,c#,asynchronous,task-parallel-library,C#,Asynchronous,Task Parallel Library,我使用并行任务库在后台运行异步任务。有时,我不得不在UI线程未被阻塞时等待后台任务完成的委托 因此: 在UI线程中启动微调器 在后台做一些需要等待的工作 然后运行另一个后台任务 停止UI中的微调器 我在UI线程(2)中启动了后台任务,之后我尝试调用Wait方法,这会导致死锁 我需要一个解决方案来等待指定的后台任务而不阻塞UI线程。NET framework是4,所以我不能使用async和wait 更新: 在UI线程中: Task task = Task.Factory.StartNew<T

我使用并行任务库在后台运行异步任务。有时,我不得不在UI线程未被阻塞时等待后台任务完成的委托

因此:

  • 在UI线程中启动微调器
  • 在后台做一些需要等待的工作
  • 然后运行另一个后台任务
  • 停止UI中的微调器
  • 我在UI线程(2)中启动了后台任务,之后我尝试调用Wait方法,这会导致死锁

    我需要一个解决方案来等待指定的后台任务而不阻塞UI线程。NET framework是4,所以我不能使用
    async
    wait

    更新:

    在UI线程中:

    Task task = Task.Factory.StartNew<T>(() => BackgroundTask());
    task.ContinueWith(task => CompletedTask(((Task<T>)task).Result); // I want to prevent later tasks to start before this task is finished
    task.Wait(); // this will block the ui...
    
    Task Task=Task.Factory.StartNew(()=>BackgroundTask());
    task.ContinueWith(task=>CompletedTask(((task)task.Result);//我想阻止以后的任务在此任务完成之前启动
    task.Wait();//这将阻止ui。。。
    

    感谢您的建议。

    您可以使用
    ContinueWith
    为任务附加一个延续,并在任务完成时运行一些代码。
    wait
    在幕后有效地完成了同样的工作

    您可以使用
    Task.Factory.continuewhalll
    在所有任务集合完成后运行继续


    您可以在UI线程中使用
    TaskScheduler.FromCurrentSynchronizationContext()
    来获得能够在UI线程中调度任务的任务调度器。

    谢谢您的回答,我尝试过(可能是我搞错了或没有抓住要点)但它不起作用。当我在UI线程中调用后台任务时,我在已完成的任务中设置ContinueWith。但稍后在UI线程中,我启动另一个任务。我想等待第一个任务完成。这就是我尝试使用wait的原因。@hcpeter请显示您试图编辑问题的内容,我们可以帮助您纠正错误@hcpeter存储对该任务的引用,并在该任务完成后的某个时间点,当您想要执行某项操作时,向该任务添加一个延续,而不是等待。您是否使用Visual Studio 2012或更高版本?如果是这样,您可以使用该包在.NET 4.0中启用async/await。不幸的是,与2010相比,请使用Stephen Toub的
    然后
    或迭代模式。更多详细信息: