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

C# 如何等待(TPL)任务启动?,c#,task-parallel-library,C#,Task Parallel Library,使用启动新任务后 Task waitUntilSaved = Task.Factory.StartNew(() => { ... }); 我怎样才能等到它开始呢?也就是说,我只想在知道任务已启动且waituntlsave.StatusequalsTaskStatus.Running时在流中继续 或者这是没有意义的,因为任务可能在没有实际执行第一条语句的情况下启动了 编辑: 是的,我确实希望确保调用第一个语句。这是我的设想。我有一个Web UI,我通过Selenium进行了试驾。在UI执行

使用启动新任务后

Task waitUntilSaved = Task.Factory.StartNew(() => { ... });
我怎样才能等到它开始呢?也就是说,我只想在知道任务已启动且
waituntlsave.Status
equals
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();
任务的第一条语句将停止任务并等待小部件显示。任务的第二条语句只是等待小部件再次消失

启动任务后的第一条语句(我想去掉的非常难看的语句)是在单击save按钮之前确保任务的第一条语句得到执行(或者说增加了执行的机会)


如果
saveButton.Click执行得太早,任务可能无法捕获“正在保存”小部件的出现和消失,从而永久停止任务。

您可以尝试执行以下操作:

    ManualResetEvent mre = new ManualResetEvent(false);

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

    });

    mre.WaitOne();

    // code after... 

您可以尝试这样做:

    ManualResetEvent mre = new ManualResetEvent(false);

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

    });

    mre.WaitOne();

    // code after... 

您可以尝试这样做:

    ManualResetEvent mre = new ManualResetEvent(false);

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

    });

    mre.WaitOne();

    // code after... 

您可以尝试这样做:

    ManualResetEvent mre = new ManualResetEvent(false);

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

    });

    mre.WaitOne();

    // code after... 

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


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

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


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

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


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

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



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

听起来确实毫无意义。对于您的问题“创建并启动任务”并不十分确定。@Habib
StartNew
计划任务的执行。它可能会在几分之一秒后执行。我认为他希望等到它实际启动,即lambda的第一条指令已经执行。我个人不认为这样做有什么意义,没有任何上下文。欢迎使用异步编程。任务将启动,但无法保证何时启动。它也将完成,但它不保证何时或状态如何。
任务
对象本身提供了一些方法(例如
.ContinueWith
)通过回调来检查其进度。很可能您试图解决错误的问题。有了更多的上下文,就有可能找到更好的解决方案。这听起来毫无意义。对于你的问题“创建并启动任务”并不十分确定。@Habib
StartNew
计划任务的执行。它可能会在几分之一秒后执行。我认为他希望等到它实际启动,即lambda的第一条指令已经执行。我个人不认为这样做有什么意义,没有任何上下文。欢迎使用异步编程。任务将启动,但无法保证何时启动。它也将完成,但它不保证何时或状态如何。
任务
对象本身提供了一些方法(例如
.ContinueWith
)通过回调来检查其进度。很可能您试图解决错误的问题。有了更多的上下文,就有可能找到更好的解决方案。这听起来毫无意义。对于你的问题“创建并启动任务”并不十分确定。@Habib
StartNew
计划任务的执行。它可能会在几分之一秒后执行。我认为他希望等到它实际启动,即lambda的第一条指令已经执行。我个人不认为这样做有什么意义,没有任何上下文。欢迎使用异步编程。任务将启动,但无法保证何时启动。它也将完成,但它不保证何时或状态如何。
任务
对象本身提供了一些方法(例如
.ContinueWith
)通过回调来检查其进度。很可能您试图解决错误的问题。有了更多的上下文,就有可能找到更好的解决方案。这听起来毫无意义。对于你的问题“创建并启动任务”并不十分确定。@Habib
StartNew
计划任务的执行。它可能会在几分之一秒后执行。我认为他希望等到它实际启动,即lambda的第一条指令已经执行。我个人不认为这样做有什么意义,没有任何上下文。欢迎使用异步编程。任务将启动,但无法保证何时启动。它也将完成,但它不保证何时或状态如何。
任务
对象本身提供了一些方法(例如
.ContinueWith
)通过回调来检查其进度。很可能您试图解决错误的问题。与m