我如何等待(TPL)任务启动?

时间:2014-06-09 13:11:54

标签: c# task-parallel-library

使用

开始新任务后
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的外观消失,从而永远停止任务

2 个答案:

答案 0 :(得分:3)

这没有意义,因为任务运行的线程可以随时由OS暂停。确定它已启动后,可以直接暂停。

您的同步方案可能需要重新思考。

答案 1 :(得分:0)

您可以尝试这样做:

    ManualResetEvent mre = new ManualResetEvent(false);

    Task waitUntilSaved = Task.Factory.StartNew(() => {
        mre.Set();

    });

    mre.WaitOne();

    // code after...