如何在WinRT中模拟Task.Wait()?

时间:2013-05-21 10:25:50

标签: c# task-parallel-library synchronous

我已经读过,如果Wait()Task实际启动之前被调用,那么TaskScheduler可能会尝试在调用{{1}的线程上内联任务}。这对我来说是不可取的,因为我试图保证某些操作的执行顺序,并且内联调用可能会搞砸了。基本上,我暴露了两种排队项目的方法(一个异步和一个同步)。同步方法使用Wait()等待操作的结果,一旦它进入另一个线程的队列并执行,但现在我已将其切换为:

Wait()

这看起来有点吓人,有点臭,但还有另一种方法可以在没有调度程序尝试内联计划的情况下等待任务完成吗?像这样的等待似乎有效,但如果有的话,我宁愿使用另一种方法。我只限于Windows运行时库。

2 个答案:

答案 0 :(得分:2)

@Pako在评论中提出了这个问题,这似乎是一个与ContinueWith结合使用的简单解决方案;这将同步等到MyTask完成;

var manualResetEvent = new ManualResetEvent(false);

Task.Run(() => MyTask()).ContinueWith(x => { manualResetEvent.Set(); });

manualResetEvent.WaitOne();

答案 1 :(得分:1)

如果您正在尝试保证某些操作的顺序,那么您可以使用适用于此的工具:ContinueWith()。如果您Wait()对该方法返回Task,则可以确保Task不会过早启动。

但是将Wait()async方法结合使用可能会非常危险并且经常会导致死锁。如果您有方法的异步版本,通常也没有任何理由让您创建同步版本。