取决于做工作方法,我的结果既可以是字符串列表或字节的名单[]后台工作运行工人完成
我们如何检查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