有没有其他更好的方法将参数传递给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
}
您可以为参数定义结构/类,创建该类型的对象,填充参数,并将其作为对象参数发送。稍后直接从对象中使用它们,而不是像示例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
}