Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Backgroundworker - Fatal编程技术网

C# 生命周期方法的任务与线程与后台工作线程

C# 生命周期方法的任务与线程与后台工作线程,c#,multithreading,task,backgroundworker,C#,Multithreading,Task,Backgroundworker,我对这一切有点困惑。我需要在我的应用程序中创建一个生存期方法,它将与asp net web服务通信,并返回一些结果。只要我的应用程序还在运行,这个方法就永远不会停止 方法1创建任务。 方法2使用后台工作程序 方法3使用线程 new Thread(() => { Thread.CurrentThread.IsBackground = true; while(true) { Thread.Sleep(5000); Console.WriteLine("

我对这一切有点困惑。我需要在我的应用程序中创建一个生存期方法,它将与asp net web服务通信,并返回一些结果。只要我的应用程序还在运行,这个方法就永远不会停止

方法1创建任务。 方法2使用后台工作程序 方法3使用线程

new Thread(() =>
{
   Thread.CurrentThread.IsBackground = true;
   while(true)
   {
      Thread.Sleep(5000);
      Console.WriteLine("Run every 5 seconds");
   }
 }).Start();
对我来说,哪种方法更有效? 还有一个优化问题,是使用task.delayx、Thread.Sleepx每x秒运行一次循环,还是创建一个计时器作为每x秒触发一次事件的秒数示例

对我来说,哪种方法更有效

这些都不对。它们都是后台工作者,这对于IO绑定任务来说是错误的

你不会雇佣一个工人什么都不做,只会每天睡23小时59分钟59.9999秒,做0.0001秒的工作。所以你也不应该雇佣线程来做这件事

异步IO应该使用异步编写,并且应该在需要IO结果的任何上下文上运行。不要使用Task.Run。在循环中使用异步IO

使用任务、延迟、线程、睡眠还是创建计时器更好

不要雇佣工人,然后让他们睡觉。要么使用延迟,要么制作计时器。选择哪一个更适合您的程序结构。但重要的是,所有的工作流都应该在主线程上完成,并且IO调用必须是异步的

对我来说,哪种方法更有效

这些都不对。它们都是后台工作者,这对于IO绑定任务来说是错误的

你不会雇佣一个工人什么都不做,只会每天睡23小时59分钟59.9999秒,做0.0001秒的工作。所以你也不应该雇佣线程来做这件事

异步IO应该使用异步编写,并且应该在需要IO结果的任何上下文上运行。不要使用Task.Run。在循环中使用异步IO

使用任务、延迟、线程、睡眠还是创建计时器更好


不要雇佣工人,然后让他们睡觉。要么使用延迟,要么制作计时器。选择哪一个更适合您的程序结构。但重要的是,所有的工作流都应该在主线程上完成,IO调用必须是异步的。

您关心可取消性吗?您是否关心从主线程管理异常?如果您想让工作永远并行进行,您可能不想耗尽线程池线程;对我来说,在您创建并让其运行的线程上运行更有意义。您确定在方法1中需要tokenSource吗?我想你不会的。如果这个线程将一直运行到应用程序死亡,那么您就不需要它了。还是我在这里遗漏了什么?若我理解正确的话,当所有前台线程完成后,应用程序将关闭,同时,它将销毁所有后台线程。下一个问题:你们需要这个方法的结果吗?如果您这样做,那么您应该使用任务,如果您不这样做,那么使用线程。在某些情况下,我将从ui线程中的方法返回一些结果。例如,若服务器有一些结果,我将打开一个新表单,告知客户这是关于什么的。在我的应用程序中,哪一种方法能提供更好的性能和速度?哪一种方法更受欢迎?使用时间或任务。延迟?永远保持一条线索,主要是睡觉,这通常不是一个明智的想法。任务1和任务2之间没有根本区别。延迟也使用计时器,你只是看不见而已。除了一个令人讨厌的小细节,若你们实际做的事情需要超过5秒钟,那个么BackgroundWorker会提醒你们这一点,只有一个例外。任务只需要5秒以上,现在已经完成了。您是否关心可取消性?您是否关心从主线程管理异常?如果您想让工作永远并行进行,您可能不想耗尽线程池线程;对我来说,在您创建并让其运行的线程上运行更有意义。您确定在方法1中需要tokenSource吗?我想你不会的。如果这个线程将一直运行到应用程序死亡,那么您就不需要它了。还是我在这里遗漏了什么?若我理解正确的话,当所有前台线程完成后,应用程序将关闭,同时,它将销毁所有后台线程。下一个问题:你们需要这个方法的结果吗?如果您这样做,那么您应该使用任务,如果您不这样做,那么使用线程。在某些情况下,我将从ui线程中的方法返回一些结果。例如,若服务器有一些结果,我将打开一个新表单,告知客户这是关于什么的。在我的应用程序中,哪一种方法能提供更好的性能和速度?哪一种方法更受欢迎?使用时间或任务。延迟?永远保持一条线索,主要是睡觉,这通常不是一个明智的想法。1和2之间没有根本的区别,Task.Del
ay也使用计时器,你只是看不见而已。除了一个令人讨厌的小细节,若你们实际做的事情需要超过5秒钟,那个么BackgroundWorker会提醒你们这一点,只有一个例外。任务只需要5秒以上,现在已经完成了。如果我的主线程是一个UI线程Winforms/WPF,并且我让它执行所有工作流,那么它如何有时间刷新UI并允许响应UI?@joedotnot:通过确保1所有等待高延迟IO操作的操作都是异步的,第二,每一个CPU计算在完成某种异步产出之前所花费的时间不到,比如说,30毫秒。如果你这样做的话,用户界面的响应速度将比人类所能感觉到的快,并且看起来会很平滑。听起来很合理,但是我如何提供一个异步IO,在不使用内部任务的情况下返回任务呢?我知道有内置的异步方法。但是我需要使用本机代码来实现异步API吗?@joe:恐怕我不明白你的问题。也许这会有帮助@乔:我不知道怎么回答你的问题。这对我来说肯定很难。我非常擅长为编程语言构建语义分析器,对异步IO的实现细节一无所知。这就是为什么我把这项工作留给it专家的原因。如果我的主线程是一个UI线程Winforms/WPF,并且我让它完成所有工作流,那么它如何有时间刷新UI并允许响应UI?@joedotnot:通过确保1所有等待高延迟IO操作的操作都是异步的,第二,每一个CPU计算在完成某种异步产出之前所花费的时间不到,比如说,30毫秒。如果你这样做的话,用户界面的响应速度将比人类所能感觉到的快,并且看起来会很平滑。听起来很合理,但是我如何提供一个异步IO,在不使用内部任务的情况下返回任务呢?我知道有内置的异步方法。但是我需要使用本机代码来实现异步API吗?@joe:恐怕我不明白你的问题。也许这会有帮助@乔:我不知道怎么回答你的问题。这对我来说肯定很难。我非常擅长为编程语言构建语义分析器,对异步IO的实现细节一无所知。这就是为什么我把这份工作留给那些在这方面很有经验的人去做。
Timer t = new Timer();   
t.Interval = 5000;    
timer1.Enabled = true;  
timer1.Tick += new 
System.EventHandler(OnTimerEvent);

private void OnTimerEvent(object sender, EventArgs e) 
{
 backgroundWorker1.RunWorkerAsync();
}
new Thread(() =>
{
   Thread.CurrentThread.IsBackground = true;
   while(true)
   {
      Thread.Sleep(5000);
      Console.WriteLine("Run every 5 seconds");
   }
 }).Start();