等待任务完成

本文关键字:任务 等待 | 更新日期: 2023-09-27 18:17:54

我是新来的线程,我正试图找出一种方法来使用任务来完成这个:

private void botCore()
{
    if (CheckBox2.Checked == true)
    {
        Task Core =  Task.Factory.StartNew(() =>
        {
            MessageBox.Show("Proxy -> Next");
            Webbrowser1.Navigate("www.lalaland.com")
        });
        Core.ExecuteFor(2000)); // Executes the task above for only 2000 milliseconds then proceeds
        if  (Core.IsCompleted)              // Checks if the 2000 milliseconds are up then executes another statement.
        {
            MessageBox.Show("Proxy -> Next after next");
            Webbrowser1.Navigate("www.balalala.com")
            ExecuteFor(3000) //Execute this for 3000 milliseconds.
        }
        Core.Stop();
    }
}

基本上,我试图运行一个任务x的时间,一旦任务完成,它运行另一个任务x的时间,并在一个循环中做它。如果这可以在一个更好的方式来完成,像ui线程,请向我提供一个源工作从。我对c#还是个新手。感谢所有支持我的人。

等待任务完成

我在你的代码中看到两个常见的错误假设:

  • 你正在从UI线程以外的线程调用UI方法。在Windows中,通常只有一个UI线程,所有的UI更新都必须在该线程上完成。
  • 你试图控制一个线程"外部",告诉它执行这么长时间,并停止命令。一般情况下,这是不可能的;一个线程是完全独立的,不会停止,直到想要停止。

如果您只是想引入一些延迟,则不需要线程。您可以使用async:

private async Task botCore()
{
  if (CheckBox2.Checked == true)
  {
    MessageBox.Show("Proxy -> Next");
    Webbrowser1.Navigate("www.lalaland.com")
    await Task.Delay(2000);
    MessageBox.Show("Proxy -> Next after next");
    Webbrowser1.Navigate("www.balalala.com");
    await Task.Delay(3000);
  }
}

一个简单的解决方案是调用Core.Wait(_time_to_wait_)并检查返回值。如果为true,则任务完成。否则错误。如果任务超时,您想要"杀死"它,请参考:http://msdn.microsoft.com/en-us/library/dd537607.aspx

请注意,如果在Task.Factory.StartNew之后立即调用Task.Wait,则计时器可能在任务执行之前就超时了,因为任务首先被放置到任务调度程序的队列中,并且在任务初始化和执行之间可能存在明显的延迟。为了避免这种情况(如果您希望在高负载下精确控制时间,这是发生延迟的主要场景),请向任务添加一个额外的信号,并先等待它:

var started = new ManualResetEventSlim(false);
var t = Task.Factory.StartNew(() =>
    {
        started.Set();
        //...
    });
started.Wait();
t.Wait(2000);

如果你问我,我会说开始使用方法。这是一个开始。除此之外,看看这个例子。这不能解释一切,但没关系。http://msdn.microsoft.com/en-us/library/dd537610.aspx

注意:你可以等待一个任务。但当它完成时,它就会结束。它不会在2000ms之后自动关闭,您需要手动关闭

除此之外,试试这个例子,,…没有测试过

private void botCore()
{
    if (CheckBox2.Checked == true)
    {
       Task coreTask = Task.Factory.StartNew(() => printMessage("1", "www.google.nl"));
       await Task.Delay(2000);
       coreTask.Stop() // AS you asked that it will stop.
        if  (coreTask.IsCompleted) // Checks if the 2000 milliseconds are up then executes another statement.
        {
           Task coreTask2 = Task.Factory.StartNew(() => printMessage("2", "www.google.nl?p=2"));
           await Task.Delay(3000);
           coreTask2.Stop() // AS you asked that it will stop.
        }
        Core.Stop();
    }
}

public void printMessage(string text, string url){
    MessageBox.Show("Proxy -> " + text);
    Webbrowser1.Navigate(url)
}