如果我有一個由兩個小方法大方法:C#打破較大的方法分成兩個線程
public int LargeMethod()
{
int result = 0;
result += SmallMethodA();
result += SmallMethodB();
}
兩個小方法擋住了我的計劃,至少有2個秒鐘,我相信它真的會更好性能如果我讓這兩個方法在自己的線程運行。
你能推薦一個編程模型嗎?
如果我有一個由兩個小方法大方法:C#打破較大的方法分成兩個線程
public int LargeMethod()
{
int result = 0;
result += SmallMethodA();
result += SmallMethodB();
}
兩個小方法擋住了我的計劃,至少有2個秒鐘,我相信它真的會更好性能如果我讓這兩個方法在自己的線程運行。
你能推薦一個編程模型嗎?
如果您使用的是.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;
}
CLR2:
CLR4:
希望這有助於
PS;你看着'平行塊'模式。
閱讀本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;
}
如果操作很短,我可能就把電話給他們入正在使用的ThreadPool
執行匿名方法,配對使用Interlocked
類更新result
變量。
任務如何?未經測試的代碼如下...
Task<int> t1 = new Task<int>(() => return SmallMethodA());
Task<int> t2 = t1.ContinueWith((t) => return t.Result + SmallMethodB());
t1.Start();
當然,你可以在一個任務中包裝SmallMethodA和SmallMethodB。如果以後要寫入UI,請務必使用在當前線程上下文中運行的ContinueWith任務。
這不會並行運行它們。 – 2010-11-29 12:26:29
好點Albin .... – Tom 2010-11-29 13:03:41
我喜歡阿爾賓Sunnanbo的回答(http://stackoverflow.com/questions/4303605/c-breaking-larger-method-into-雙線程/ 4303662#4303662)
但當時只有1叉使它只是有點更快,更簡潔:
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
工程,但打破了吻。當叉子數量未知時,您應該使用Parallel.For或Foreach。 – gjvdkamp 2010-11-29 12:54:44