后台辅助角色运行辅助角色已完成

本文关键字:角色 已完成 运行 后台 | 更新日期: 2023-09-27 17:55:51

根据 do 工作方法,我的结果可以是字符串列表或字节列表[]

我们如何检查RunWorkerCompletedEventArgs e -

if (e is List<String>)

这是正确的检查方法吗?

后台辅助角色运行辅助角色已完成

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

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

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

是的,这是一种可能的方法。

如果您只有两种类型,那将非常容易:

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();
    }
};

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

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