最快将代码包装到线程中?

时间:2013-10-01 05:16:23

标签: c# .net multithreading

如果我有一部分代码要在后台线程中执行,.NET (C#)中最简单的方法是什么?

例如

myObject1.myFunction(10, "Test");
myObject2.myFunction(20, "Test");
myObject3.myFunction(30, "Test");

在后台线程中运行上述代码的最简单方法是什么?

5 个答案:

答案 0 :(得分:2)

如果您使用的是4.0+ .NET版本,我认为这是最短的方式:

Task.Factory.StartNew(() => 
{
   myObject1.myFunction(10, "Test");
   myObject2.myFunction(20, "Test");
   myObject3.myFunction(30, "Test"); 
})

更多:http://msdn.microsoft.com/en-us/library/dd321439.aspx

Jeroen提议使用Thread.Start执行此任务,这个任务稍微短一些,但根据Skeet,当你使用普通线程而不是任务时,你会失去这些东西:

  

该任务为您提供了任务API的所有优点:

     
      
  • 添加延续(Task.ContinueWith)
  •   
  • 等待完成多项任务(全部或全部)
  •   
  • 捕获任务中的错误并稍后查询
  •   
  • 捕获取消(并允许您指定取消开始)
  •   
  • 可能具有返回值
  •   
  • 在C#5中使用await
  •   
  • 更好地控制日程安排(如果它会长时间运行,请在创建时说明   任务,以便任务调度程序可以考虑到这一点)
  •   

答案 1 :(得分:1)

可能更简单的方法是通过后台工作人员:

class Program
{
  static BackgroundWorker _bw = new BackgroundWorker();

  static void Main()
  {
    _bw.DoWork += bw_DoWork;
    _bw.RunWorkerAsync ();
    Console.ReadLine();
  }

  static void bw_DoWork (object sender, DoWorkEventArgs e)
  {
    myObject1.myFunction(10, "Test");
    myObject2.myFunction(20, "Test");
    myObject3.myFunction(30, "Test");
  }
}

答案 2 :(得分:1)

我会用这个:

new Thread( () =>
{
    myObject1.myFunction(10, "Test");
    myObject2.myFunction(20, "Test");
    myObject3.myFunction(30, "Test");
}).Start();

这适用于.NET版本4.5,4,3.5,3.0,2.0

答案 3 :(得分:1)

正如Giedrius所说,如果您使用的是.NET 4.0+,那么TPL库就是您的选择。一个好的做法是在完成时检查线程是否由于未处理的异常而失败,使用ContinueWith和task.IsFaulted。

Task.Factory.StartNew(() => 
{
    myObject1.myFunction(10, "Test");
    myObject2.myFunction(20, "Test");
    myObject3.myFunction(30, "Test"); 
}).ContinueWith(task => {
        if(task.IsFaulted)
        {
            AggregateException ex = task.Exception;
            //handle exception
        }
    });

Task.Factory.StartNew(() => { myObject1.myFunction(10, "Test"); myObject2.myFunction(20, "Test"); myObject3.myFunction(30, "Test"); }).ContinueWith(task => { if(task.IsFaulted) { AggregateException ex = task.Exception; //handle exception } });

答案 4 :(得分:0)

使用匿名委托包裹:

ThreadPool.QueueUserWorkItem(delegate(object state) {

    // extract parameters from the object
    object[] array = state as object[];

    // your code here
    myObject1.myFunction(array[0], "Test");
    myObject2.myFunction(array[1], "Test");
    myObject3.myFunction(array[2], "Test");

}, 

// pass parameters as object
new object[] { 10, 20, 30 }

);

更多信息:http://msdn.microsoft.com/en-us/library/3dasc8as(v=vs.100).aspx