2011-05-09 61 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事件处理程序的结果。就是这个,你需要检查。