背景工人运行工人完成

时间:2011-05-09 13:09:11

标签: c# backgroundworker

取决于do work方法,我的结果可以是字符串列表或字节列表[]

我们如何检查RunWorkerCompletedEventArgs e -

if (e is List<String>)

这是检查的正确方法吗?

3 个答案:

答案 0 :(得分: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;
}

这使得支持新类型变得更加简单,并且当if-else-if遇到订单问题时,它仍然是O(1)。

在你的后台工作者中使用它将如下:

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

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

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

答案 1 :(得分:2)

不,这不是正确的方法 正确的方法是使用它:

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

e始终为RunWorkerCompletedEventArgs类型。但是此类包含一个属性Result,其中包含DoWork事件处理程序的结果。那就是那个,你需要检查一下。

答案 2 :(得分:0)

e.Result是包含结果的属性,因此要获得您可以执行的类型:

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