后台工作者运行工作者完成

发布于 2024-11-06 03:01:06 字数 166 浏览 4 评论 0 原文

根据 do work 方法,我的结果可能是字符串列表或 byte[] 列表

我们如何检查 RunWorkerCompletedEventArgs e -

if (e is List<String>)

这是正确的检查方法吗?

depending on the do work method my result could either be a List of Strings or a list of byte[]

How can we check the RunWorkerCompletedEventArgs e -

if (e is List<String>)

is this the correct way to check?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

未蓝澄海的烟 2024-11-13 03:01:06

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

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

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

No, this is not the right way.
The correct way is to use this:

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

e will always be of type RunWorkerCompletedEventArgs. But this class contains a property Result that contains the result of your DoWork event handler. That's the one, you need to check.

2024-11-13 03:01:06

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

如果您只有两种类型,那就很容易了:

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

但是如果您必须支持超过两种或三种类型,问题就会出现。在这种情况下,我将创建一个 Dictionary> 并为每种类型编写单独的函数。像这样的事情:

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

Yes, that's one possible way to do it.

If you only have two types it would be quite easy:

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

But the problem comes in to play if you have to support more than just two or three. In that case i'm going to create a Dictionary<Type, Action<object>> and write individual functions for each type. Something like this:

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

This makes it more simple to support new types and also stays to be O(1) while the if-else-if runs into the order-matters problem.

Used will this in your background worker as followed:

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

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

    if(supportedAction != null)
    {
        supportedAction();
    }
};
可是我不能没有你 2024-11-13 03:01:06

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

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

the e.Result is the property with your results, so to get the type you can do:

if(e.Result.GetType().Equals(typeof(List<String>)))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文