0

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

while(t.Status == TaskStatus.Created)
    Task.Delay(10).Wait();

t.wait();

这看起来有点吓人,而且很臭,但是有没有另一种方法可以等待任务完成而不让调度程序尝试内联调度它?像这样等待似乎可行,但如果有的话,我宁愿使用另一种方法。我仅限于 Windows 运行时库。

4

2 回答 2

2

@Pako 在评论中提出了这个建议,这似乎是一个足够简单的解决方案,可以与ContinueWith;结合使用 这将同步等待直到MyTask完成;

var manualResetEvent = new ManualResetEvent(false);

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

manualResetEvent.WaitOne();
于 2013-05-21T10:47:48.170 回答
1

如果您试图保证某些操作的顺序,那么您可以使用专门用于此目的的工具:ContinueWith(). 如果您使用从该方法返回Wait()的 a Task,您可以确定Task不会过早启动。

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

于 2013-05-21T22:47:00.837 回答