使用
开始新任务后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
执行得太早,任务可能无法捕捉"正在保存" -widget的外观和消失,从而永远停止任务
答案 0 :(得分:3)
这没有意义,因为任务运行的线程可以随时由OS暂停。确定它已启动后,可以直接暂停。
您的同步方案可能需要重新思考。
答案 1 :(得分:0)
您可以尝试这样做:
ManualResetEvent mre = new ManualResetEvent(false);
Task waitUntilSaved = Task.Factory.StartNew(() => {
mre.Set();
});
mre.WaitOne();
// code after...