Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待任务完成_C#_Multithreading_Task Parallel Library - Fatal编程技术网

C# 等待任务完成

C# 等待任务完成,c#,multithreading,task-parallel-library,C#,Multithreading,Task Parallel Library,我是线程新手,我正试图找到一种使用任务来完成此任务的方法: private void botCore() { if (CheckBox2.Checked == true) { Task Core = Task.Factory.StartNew(() => { MessageBox.Show("Proxy -> Next"); Webbrowser1.Navigate("www.lalal

我是线程新手,我正试图找到一种使用任务来完成此任务的方法:

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#还很陌生。感谢所有支持我的人。

一个简单的解决方案是调用
Core.Wait(\u time\u to\u Wait)
并检查返回值。如果为true,则任务已完成。否则就错了。如果任务超时,而您想“终止”它,请参阅以下内容:

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

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

一个简单的解决方案是调用
Core.Wait(\u time\u to\u Wait)
并检查返回值。如果为true,则任务已完成。否则就错了。如果任务超时,而您想“终止”它,请参阅以下内容:

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

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

如果你问我,我会说开始使用方法。这是一个开始。 除此之外,看看这个例子。。这不能解释一切,但没关系。

注意:您可以等待任务。但它会在完成后结束。它在2000毫秒后不会自动关闭。您需要手动执行此操作

除此之外,试试这个例子,,。。没有测试它

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)
}

如果你问我,我会说开始使用方法。这是一个开始。 除此之外,看看这个例子。。这不能解释一切,但没关系。

注意:您可以等待任务。但它会在完成后结束。它在2000毫秒后不会自动关闭。您需要手动执行此操作

除此之外,试试这个例子,,。。没有测试它

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)
}

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

  • 您正在从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);
  }
}

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

  • 您正在从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);
  }
}

等待任务延迟(2000)Core.ExecuteFor(2000))
等待任务。延迟(2000)。它不显示任何句点。没有消息框或其他任何东西。延迟也不起作用。
等待任务。延迟(2000)Core.ExecuteFor(2000))
等待任务。延迟(2000)。它不显示任何句点。没有消息框或其他任何东西。延迟也不起作用。你不应该使用
任务。但在这种情况下,等待
——这将阻塞UI线程两秒钟,这几乎肯定是不可取的。@JonSkeet你说得对。没有意识到这是一个UI线程。在这种情况下,可以创建一个新任务来处理等待。或者我们可以将例程分解为多个异步处理程序,这对于C#初学者来说更为困难。@user2476620如果您将等待的代码包装到另一个任务中,请检查以下内容:您不应该使用
task。但是,在这种情况下,等待将阻塞UI线程两秒钟,这几乎肯定是不可取的。@JonSkeet您是对的。没有意识到这是一个UI线程。在这种情况下,可以创建一个新任务来处理等待。或者我们可以将例程分解为多个异步处理程序,这对于C#初学者来说更为困难。@user2476620如果您将等待代码包装到另一个任务中,请检查:它是否有意外行为?抛出异常?是否有意外行为?抛出异常?