如何等待(TPL)任务启动?
本文关键字:TPL 任务启动 等待 何等待 | 更新日期: 2023-09-27 18:07:33
使用
启动新任务后Task waitUntilSaved = Task.Factory.StartNew(() => { ... });
我怎么能等到它开始?也就是说,只有当我知道任务已经启动并且waitUntilSave.Status
等于TaskStatus.Running
时,我才想在流程中继续。
编辑:是的,我确实想确保第一个语句被调用。这是我的设想。我有一个Web UI,我通过Selenium测试驱动它。有一个元素(小部件)在 UI执行保存操作时显示为。在测试中,我要确保
A)小部件在保存时出现
B)在小部件再次不可见(因此保存已完成)后继续测试。
我写了:
Task waitUntilSaved = Task.Factory.StartNew(() =>
{
Driver.FindElementOrNull(By.Id("isSavingPosition"), FindBehavior.WaitUntilDisplayed);
Driver.FindElement(By.Id("isSavingPosition"), FindBehavior.WaitUntilHidden);
});
Thread.Sleep(10); // how can I get rid of this?
Assert.AreEqual(TaskStatus.Running, waitUntilSaved.Status);
saveButton.Click();
waitUntilSaved.Wait();
任务的第一条语句将停止任务并等待小部件显示。任务的第二条语句只是等待小部件再次消失。
启动任务后的第一个语句——我想摆脱的非常丑陋的语句——是确保(或者更确切地说增加机会)在单击保存按钮之前执行任务的第一个语句。
如果saveButton.Click
执行得太早,任务可能无法捕捉到和消失的"正在保存"小部件,从而永远停止任务。
这是没有意义的,因为任务运行的线程可以在任何时候被操作系统暂停。您可以在确定它已启动后直接暂停它。
可能,您的同步方案需要重新考虑。
您可以尝试这样做:
ManualResetEvent mre = new ManualResetEvent(false);
Task waitUntilSaved = Task.Factory.StartNew(() => {
mre.Set();
});
mre.WaitOne();
// code after...