2011-05-09 95 views
1

取決於做工作方法,我的結果既可以是字符串列表或字節的名單[]後臺工作運行工人完成

我們如何檢查RunWorkerCompletedEventArgs e -

if (e is List<String>) 

是這樣的正確的方法來檢查?

回答

2

是的,這是一種可能的方式來做到這一點。

如果你只有兩種類型這將是非常容易的:

if(e.Result is List<string>) 
{ 
} 
else if(e.Result is List<byte[]>) 
{ 
} 
else 
{ 
} 

但問題也發揮了作用,如果你有支持比只有兩個或三個以上。在這種情況下,我將創建一個Dictionary<Type, Action<object>>併爲每種類型編寫單獨的函數。事情是這樣的:

var supportedTypes = new Dictionary<Type, Action<object>>(); 
supportedTypes.Add(typeof(List<string>), ComputeListOfStrings); 
supportedTypes.Add(typeof(List<byte[]>), ComputeListOfByteArrays); 

private void ComputeListOfString(object listOfStrings) 
{ 
    var list = (List<string>)listOfStrings; 
} 

private void ComputeListOfByteArrays(object listOfByteArrays) 
{ 
    var list = (List<byte[]>)listOfByteArrays; 
} 

這使得它更簡單,支持新類型,也保持爲O(1),而if-else-if跑進訂單事宜的問題。

將使用這在你的後臺工作如下:

worker.OnRunWorkerCompleted += (sender, e) => 
{ 
    Action<object> supportedAction; 

    supportedTypes.TryGetValue(e.Result.GetType(), out supportedAction); 

    if(supportedAction != null) 
    { 
     supportedAction(); 
    } 
}; 
+1

應該不總是導致錯誤的看到,因爲實際上是RunWorkerCompletedEventArgs雖然? – rik 2011-05-09 13:14:37

+0

@rik:是的,但我認爲這是一個錯誤的問題。我認爲它應該是['RunWorkerCompletedEventArgs.Result'](http://msdn.microsoft.com/de-de/library/system.componentmodel.runworkercompletedeventargs.result.aspx)。 – Oliver 2011-05-09 13:23:46

0

的e.Result是你的結果的屬性,因此,讓你可以做類型:

if(e.Result.GetType().Equals(typeof(List<String>))) 
2

沒有,這不是正確的方法。
正確的方法是用這樣的:

if(e.Result is List<string>) 
{ 
    //... 
} 
else if(e.Result is List<byte[]>) 
{ 
    //... 
} 
else 
{ 
    //... 
} 

e永遠是RunWorkerCompletedEventArgs型。但是這個類包含一個屬性Result,其中包含您的DoWork事件處理程序的結果。就是這個,你需要檢查。