如果我有一部分代码要在后台线程中执行,.NET (C#)
中最简单的方法是什么?
例如
myObject1.myFunction(10, "Test");
myObject2.myFunction(20, "Test");
myObject3.myFunction(30, "Test");
在后台线程中运行上述代码的最简单方法是什么?
答案 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