取決於做工作方法,我的結果既可以是字符串列表或字節的名單[]後臺工作運行工人完成
我們如何檢查RunWorkerCompletedEventArgs e
-
if (e is List<String>)
是這樣的正確的方法來檢查?
取決於做工作方法,我的結果既可以是字符串列表或字節的名單[]後臺工作運行工人完成
我們如何檢查RunWorkerCompletedEventArgs e
-
if (e is List<String>)
是這樣的正確的方法來檢查?
是的,這是一種可能的方式來做到這一點。
如果你只有兩種類型這將是非常容易的:
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();
}
};
的e.Result是你的結果的屬性,因此,讓你可以做類型:
if(e.Result.GetType().Equals(typeof(List<String>)))
沒有,這不是正確的方法。
正確的方法是用這樣的:
if(e.Result is List<string>)
{
//...
}
else if(e.Result is List<byte[]>)
{
//...
}
else
{
//...
}
e
永遠是RunWorkerCompletedEventArgs
型。但是這個類包含一個屬性Result
,其中包含您的DoWork
事件處理程序的結果。就是這個,你需要檢查。
應該不總是導致錯誤的看到,因爲實際上是RunWorkerCompletedEventArgs雖然? – rik 2011-05-09 13:14:37
@rik:是的,但我認爲這是一個錯誤的問題。我認爲它應該是['RunWorkerCompletedEventArgs.Result'](http://msdn.microsoft.com/de-de/library/system.componentmodel.runworkercompletedeventargs.result.aspx)。 – Oliver 2011-05-09 13:23:46