有没有其他更好的方法将参数传递给backgroundworkerrunasync

本文关键字:参数传递 backgroundworkerrunasync 方法 其他 更好 有没有 | 更新日期: 2023-09-27 18:25:41

我是C#的新手,目前正在处理一个需要BackgroundWorkers的项目。我发现BackgroundWorkerRunWorkerSync只是将一个对象作为参数。但在某些情况下,我需要将多个对象传递到RunWorkerSync方法中。

我目前所做的是将所有对象加载到List中,然后将它们作为单个List对象传递,这很好。但我的问题是,这能做得更好还是更好?这种方法会给我带来什么问题吗?

List<object> data = new List<object>(3);
List.Add(object1);
List.Add(object2);
List.Add(object3);
bwImportData.RunWorkerAsync(data);
private void DoWork(object sender, DoWorkEventArgs e)
{
   List<object> data = e.Arguments a List<object>
   objecttype1 object1 = data[0] as objecttype1;
   objecttype2 object2 = data[0] as objecttype2;
   objecttype3 object2 = data[0] as objecttype3;
   //Do stuff
}
private void RunWorker(object sender, RunWorkerCompletedEventArgs e)
{
   //Do stuff stuff stuff
}

有没有其他更好的方法将参数传递给backgroundworkerrunasync

您可以为参数定义结构/类,创建该类型的对象,填充参数,并将其作为对象参数发送。稍后直接从对象中使用它们,而不是像示例var object1 = data[0] as objecttype1;中那样复制到局部变量中。

作为在类中包装参数的替代方法,您可以使用Action()作为参数,并在DoWork处理程序中将参数强制转换回Action,如下所示:

using System;
using System.ComponentModel;
namespace Demo
{
    class Program
    {
        static void Main()
        {
            var worker = new BackgroundWorker();
            worker.DoWork += (sender, args) => ((Action) args.Argument)();
            worker.RunWorkerAsync(new Action(() => test("My String", 12345)));
            Console.ReadLine();
        }
        static void test(string s, int i)
        {
            Console.WriteLine("String = {0}, Int = {1}", s, i);
        }
    }
}

你可以通过写一个扩展方法来让它更容易阅读,比如:

public static class BackgroundWorkerExt
{
    public static void RunWorkerAsync(this BackgroundWorker worker, Action action)
    {
        worker.RunWorkerAsync(action);
    }
}

然后对RunWorkerSync()的调用变为:

worker.RunWorkerAsync(() => test("My string", 12345));

我认为这种方法没有任何大问题。在任何情况下,你都必须将这些论点合并为一个论点。就我个人而言,我更喜欢使用元组的以下方法,它至少需要.NET 4.0:

bwImportData.RunWorkerAsync(Tuple.Create(object1,object2,object3));

private void DoWork(object sender, DoWorkEventArgs e) {
  var data = e.Arguments as Tuple<objecttype1,objecttype2,objecttype3>;
  var object1 = data.Item1;
  var object2 = data.Item2;
  var object2 = data.Item3;
  //Do stuff
}

在这里,你需要更少的演员阵容,但这并不是什么大不了的事。

以下是我如何传递多个参数

-创建参数

object obje10 = imageList[i];
object obje11 = i;
object obje12 = product_Name;
object[] parameters = new object[3] { obje10, obje11, obje12};

-使用RunWorkerSync 发送参数

worker.RunWorkerAsync(parameters);

-然后在DoWork方法中获取参数

object[] parameters = e.Argument as object[];
List<Image> imgs = parameters[0] as List<Image>;
int i = (int)parameters[1];
string product_Name = parameters[2].ToString();

我们总是可以使用我们的自定义列表,请参阅下面。

您的自定义类:

public class Worker
{
    public int Id { get; set; }
    public string Comments { get; set; }
}

列表创建:

List<Worker> workers = new List<Worker>()
{
   new Worker { Id = 1, Comments = "hello" }
};

调用后台工作人员:

 backgroundWorker1.RunWorkerAsync(workers);

读取数据:

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        List<Worker> workers = e.Argument as List<Worker>;
        //do your code here 
    }