2010-11-29 20 views
4

如果我有一個由兩個小方法大方法:C#打破較大的方法分成兩個線程

public int LargeMethod() 
{ 
int result = 0; 
result += SmallMethodA(); 
result += SmallMethodB(); 
} 

兩個小方法擋住了我的計劃,至少有2個秒鐘,我相信它真的會更好性能如果我讓這兩個方法在自己的線程運行。

你能推薦一個編程模型嗎?

回答

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

CLR2:

  • 您可以定義委託的方法,創建委託的實例,並使用「的BeginInvoke/EndInvoke會」的方法。
  • 使用「ThreadPool」到「EnqueueWorkerItem」
  • 使用System.Thread創建一個新的Thread並在其上啓動您的方法。

CLR4:

  • 使用任務庫
  • 復歸TOT模式CLR2

希望這有助於

PS;你看着'平行塊'模式。

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; 
} 
+0

工程,但打破了吻。當叉子數量未知時,您應該使用Parallel.For或Foreach。 – gjvdkamp 2010-11-29 12:54:44

0

如果操作很短,我可能就把電話給他們入正在使用的ThreadPool執行匿名方法,配對使用Interlocked類更新result變量。

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任務。

+2

這不會並行運行它們。 – 2010-11-29 12:26:29

+0

好點Albin .... – Tom 2010-11-29 13:03:41

0

我喜歡阿爾賓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