2012-10-02 58 views
1

如何在不同的域中異步執行代碼?異步執行在不同的域

例如,我有一個方法:

public void DoSomething() 
    { 
     // do something 
    } 

而且我要在10個不同的領域來執行它,就像這樣:

for (int i = 0; i < 10; i++) 
     { 
      AppDomain domain = AppDomain.CreateDomain("NewDomain - " + i); 
      domain.ExecuteAsync(DoSomething); 
     } 
+0

你爲什麼要這麼做?你可以在不同的線程上做到這一點。 –

+0

我想通過AppDomain的模擬來自不同用戶的WCF服務請求。 – ZuTa

+0

你可以簡單地產生更多的線程,並做到這一點 –

回答

1

我用這個方法解決了我的任務:

for (int i = 0; i < options.NumberOfThreads; i++) 
      { 
       tasks[i] = Task.Factory.StartNew(() => 
        { 
         using (Isolated<TesterInvoker> isolated = new Isolated<TesterInvoker>()) 
         { 
          isolated.Value.Invoke(); 
         } 
        });     
      } 

private class TesterInvoker : MarshalByRefObject 
    { 
     public void Invoke() 
     { 
      // do something 
     } 
    } 

    private class Isolated<T> : IDisposable 
     where T : MarshalByRefObject 
    { 
     private AppDomain _domain; 
     private T _value; 

     public Isolated() 
     { 
      Type type = typeof(T); 

      _domain = AppDomain.CreateDomain("Isolated:" + GetHashCode(), 
       null, AppDomain.CurrentDomain.SetupInformation); 

      _value = (T)_domain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName); 
     } 

     public T Value 
     { 
      get 
      { 
       return _value; 
      } 
     } 

     public void Dispose() 
     { 
      if (_domain != null) 
      { 
       AppDomain.Unload(_domain); 

       _domain = null; 
      } 
     } 
    }