如何等待(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执行得太早,任务可能无法捕捉到消失的"正在保存"小部件,从而永远停止任务。

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

这是没有意义的,因为任务运行的线程可以在任何时候被操作系统暂停。您可以在确定它已启动后直接暂停它。

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

您可以尝试这样做:

    ManualResetEvent mre = new ManualResetEvent(false);
    Task waitUntilSaved = Task.Factory.StartNew(() => {
        mre.Set();
    });
    mre.WaitOne();
    // code after...