2013-03-18 49 views
1

我有下面的代碼正在多線程的業務邏輯運行:併發.NET中的一個功能

using System; 
using System.Threading.Tasks; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var biz1 = new Biz { Some = 1, Value = "a" }; 
      var biz2 = new Biz { Some = 2, Value = "b" }; 
      var foo = new Foo(); 

      //thread 1 
      new Task(() => foo.Run(biz1)).Start(); 
      //thread 2 
      new Task(() => foo.Run(biz2)).Start(); 
      //more threads here for other Biz objects.... 

      Console.Read(); 
     } 
    } 

    public class Biz 
    { 
     public int Some { get; set; } 
     public string Value { get; set; } 
    } 

    public class Foo 
    { 
     public void Run(Biz biz) 
     { 
      //base on the biz object do some task here 

     } 
    } 
} 

biz對象不被隨時在穿線

問題改變了:

  • foo.Run線程安全嗎?
  • 是不是更好地實例化個別Foo對象來運行每個Biz對象(RunFoo中的唯一函數)?
+3

那麼'Foo'是否被'Run'改變了? – 2013-03-18 09:19:29

+0

如果foo.Run是線程安全的,如果我們不知道它的實際作用是不可能的 – ken2k 2013-03-18 09:20:57

+0

@Jon Skeet,'Foo'不會被'Run'改變 – James 2013-03-18 09:23:26

回答

1
  • 是foo.Run線程安全的?

這聽起來像你Foo.Run()是安全的,這取決於當然是訪問了什麼其他數據。

  • 是更好地實例個人Foo對象運行每個商務對象(運行距離富的唯一功能)?

假設它是安全的,即它不使用美孚的任何實例數據,Run()可以而且應該是static。這至少會向讀者傳達更好的信息。

public static class Foo 
{ 
    public static void Run(Biz biz) 
    { 
     //base on the biz object do some task here 

    } 
}