如果我有一个由两个小方法组成的大方法:
public int LargeMethod()
{
int result = 0;
result += SmallMethodA();
result += SmallMethodB();
}
这两个小方法都会阻止我的程序至少2秒钟,我相信如果我让这两个方法在自己的线程中运行,它的性能会更好。
你能建议一个编程模型吗?
答案 0 :(得分:4)
如果您使用的是.NET 4,则可以使用任务
public int LargeMethod()
{
int result = 0;
Task<int> t1 = new Task<int>(SmallMethodA);
Task<int> t2 = new Task<int>(SmallMethodB);
t1.Start();
t2.Start();
result += t1.Result;
result += t2.Result;
return result;
}
答案 1 :(得分:2)
请阅读 Task Parallel Library 以获取更多信息,此处您有解决方案:
Task<int>[] taskArray = new Task<int>[]
{
Task<int>.Factory.StartNew(() => SmallMethodA()),
Task.Factory.StartNew(() => SmallMethodB()),
};
int result = 0;
for (int i = 0; i < taskArray.Length; i++)
{
result += taskArray[i].Result;
}
答案 2 :(得分:1)
CLR2:
CLR4:
希望这有帮助,
PS;你看着'Parallel Block'模式。
答案 3 :(得分:0)
如果操作很短,我可能会将对它们的调用放入使用ThreadPool
执行的匿名方法中,并使用Interlocked
类来更新result
变量
答案 4 :(得分:0)
任务怎么样?未经测试的代码如下......
Task<int> t1 = new Task<int>(() => return SmallMethodA());
Task<int> t2 = t1.ContinueWith((t) => return t.Result + SmallMethodB());
t1.Start();
当然,你可以在一个任务中包装SmallMethodA和SmallMethodB。如果您之后正在写入UI,请确保使用在当前线程上下文中运行的ContinueWith任务。
答案 5 :(得分:0)
我喜欢Albin Sunnanbo的回答(http://stackoverflow.com/questions/4303605/c-breaking-larger-method-into-two-threads/4303662#4303662)
但是只用了一个叉子就可以让它更快更简洁:
public int LargeMethod()
{
var t1 = new Task<int>(SmallMethodA);
t1.Start();
int result = SmallMethodB();
result += t1.Result;
return result;
}
编辑更像是这样:
public int LargeMethod()
{
var t1 = new Task<int>.Factory.StartNew(SmallMethodA);
return SmallMethodB() + t1.Result;
}
GJ