如果我有一部分代码希望在后台线程中执行,那么.NET (C#)
实现这一目标的最简单方法是什么?
例如。
myObject1.myFunction(10, "Test");
myObject2.myFunction(20, "Test");
myObject3.myFunction(30, "Test");
在后台线程中运行上述代码的最简单方法是什么?
如果我有一部分代码希望在后台线程中执行,那么.NET (C#)
实现这一目标的最简单方法是什么?
例如。
myObject1.myFunction(10, "Test");
myObject2.myFunction(20, "Test");
myObject3.myFunction(30, "Test");
在后台线程中运行上述代码的最简单方法是什么?
如果您使用的是 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 中使用等待
- 更好地控制调度(如果要长时间运行,请在创建任务时说明,以便任务调度程序可以考虑到这一点)
可能更简单的方法是通过后台工作人员:
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");
}
}
我会用这个:
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
正如 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
}
});
使用匿名委托包装:
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