0

如果我有一部分代码希望在后台线程中执行,那么.NET (C#)实现这一目标的最简单方法是什么?

例如。

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

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

4

5 回答 5

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的说法,当你使用普通的 Thread over Task 时,你会失去这些东西:

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

  • 添加延续 (Task.ContinueWith)
  • 等待多个任务完成(全部或任何)
  • 捕获任务中的错误并在以后询问它们
  • 捕获取消(并允许您指定取消开始)
  • 可能有返回值
  • 在 C# 5 中使用等待
  • 更好地控制调度(如果要长时间运行,请在创建任务时说明,以便任务调度程序可以考虑到这一点)
于 2013-10-01T05:20:48.807 回答
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");
  }
}
于 2013-10-01T05:20:30.290 回答
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

于 2013-10-01T05:20:44.613 回答
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
        }
    });

于 2013-10-01T06:01:31.873 回答
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

于 2013-10-01T05:27:53.640 回答