C# 向后台工作人员发送参数?
假设我想向后台工作程序发送一个int参数,这是如何实现的C# 向后台工作人员发送参数?,c#,backgroundworker,C#,Backgroundworker,假设我想向后台工作程序发送一个int参数,这是如何实现的 private void worker_DoWork(object sender, DoWorkEventArgs e) { } 我知道这是worker.RunWorkerAsync();,我不明白如何在worker工作中定义它应该采用int参数。您需要方法和属性 worker.RunWorkerAsync(5); private void worker_DoWork(object sender, DoWorkEventArgs e
private void worker_DoWork(object sender, DoWorkEventArgs e) {
}
我知道这是worker.RunWorkerAsync();,我不明白如何在worker工作中定义它应该采用int参数。您需要方法和属性
worker.RunWorkerAsync(5);
private void worker_DoWork(object sender, DoWorkEventArgs e) {
int argument = (int)e.Argument; //5
}
您可以使用
dowworkeventargs.Argument
属性
worker.RunWorkerAsync(5);
private void worker_DoWork(object sender, DoWorkEventArgs e) {
int argument = (int)e.Argument; //5
}
可以在Microsoft网站上找到完整示例(即使使用int参数):
- 您可以这样开始:
int value = 123;
bgw1.RunWorkerAsync(argument: value); // the int will be boxed
Public (Class or Structure) MyPerson
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public int ZipCode { get; set; }
End Class
然后
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
int value = (int) e.Argument; // the 'argument' parameter resurfaces here
...
// and to transport a result back to the main thread
double result = 0.1 * value;
e.Result = result;
}
// the Completed handler should follow this pattern
// for Error and (optionally) Cancellation handling
private void worker_Completed(object sender, RunWorkerCompletedEventArgs e)
{
// check error, check cancel, then use result
if (e.Error != null)
{
// handle the error
}
else if (e.Cancelled)
{
// handle cancellation
}
else
{
double result = (double) e.Result;
// use it on the UI thread
}
// general cleanup code, runs when there was an error or not.
}
请查看:
尽管这是一个已经得到回答的问题,但我会留下另一个选项,IMO更容易阅读:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (obj, e) => WorkerDoWork(value, text);
worker.RunWorkerAsync();
在handler方法上:
private void WorkerDoWork(int value, string text) {
...
}
您可以像这样传递多个参数
List<object> arguments = new List<object>();
arguments.Add("first"); //argument 1
arguments.Add(new Object()); //argument 2
// ...
arguments.Add(10); //argument n
backgroundWorker.RunWorkerAsync(arguments);
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
List<object> genericlist = e.Argument as List<object>;
//extract your multiple arguments from
//this list and cast them and use them.
}
List参数=新列表();
参数。添加(“第一”)//论据1
参数。添加(新对象())//论据2
// ...
增加(10)//论点
backgroundWorker.RunWorkerAsync(参数);
私有void worker_DoWork(对象发送方,DoWorkEventArgs e)
{
List genericlist=e.参数为List;
//从中提取多个参数
//此列表并强制转换它们并使用它们。
}
如果要传递多种类型的参数,可以尝试此方法,首先将它们全部添加到Object类型的数组中,然后将该对象传递给RunWorkerAsync(),例如:
some_Method(){
List<string> excludeList = new List<string>(); // list of strings
string newPath ="some path"; // normal string
Object[] args = {newPath,excludeList };
backgroundAnalyzer.RunWorkerAsync(args);
}
some_方法(){
List excludeList=new List();//字符串列表
string newPath=“某些路径”;//普通字符串
对象[]args={newPath,excludeList};
backgroundAnalyzer.RunWorkerAsync(args);
}
现在在后台工作人员的工作方法中
backgroundAnalyzer_DoWork(object sender, DoWorkEventArgs e)
{
backgroundAnalyzer.ReportProgress(50);
Object[] arg = e.Argument as Object[];
string path= (string)arg[0];
List<string> lst = (List<string>) arg[1];
.......
// do something......
//.....
}
backgroundAnalyzer\u DoWork(对象发送方,DoWorkEventArgs e)
{
背景分析:报告进展(50);
对象[]arg=e。参数作为对象[];
字符串路径=(字符串)参数[0];
List lst=(List)arg[1];
.......
//做点什么。。。。。。
//.....
}
您应该始终尝试使用具有具体类型的复合对象(使用复合设计模式),而不是对象类型列表。谁会记得这些东西到底是什么?以后再考虑代码的维护。。。相反,请尝试以下方法:
int value = 123;
bgw1.RunWorkerAsync(argument: value); // the int will be boxed
Public (Class or Structure) MyPerson
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public int ZipCode { get; set; }
End Class
然后:
Dim person as new MyPerson With { .FirstName = “Joe”,
.LastName = "Smith”,
...
}
backgroundWorker1.RunWorkerAsync(person)
然后:
private void backgroundWorker1_DoWork (object sender, DoWorkEventArgs e)
{
MyPerson person = e.Argument as MyPerson
string firstname = person.FirstName;
string lastname = person.LastName;
int zipcode = person.ZipCode;
}
我该如何处理两个参数?或者我该如何发送一个包含多个参数的对象?@soo:使用一个helper类或一个
元组(C#4+)(编辑:是的,使用一个对象将其全部打包。例如,请参见DoWorkEventArgs self)。但是如何将结果通知UI?@rayray:label1.Text=e.result.ToString()代码>,我在任何地方都把它标记为安全的。我不知道我的意思,我以为这是一个C#的东西。我在谷歌上搜索了“C#IMO”并在这里登陆,得到了答案…哈哈,3个参数怎么样?我从2012年起就不玩.NET了,但如果我没有弄错的话,你可以添加你想要的参数…=>工人工作(a、b、c)代码>只要它匹配方法签名。。。WorkerDowWork(intA、stringB、stringC){…
请记住,如果您使用此方法(就像我尝试的那样),每次都必须创建一个新的backgroundworker(在您的示例中您这样做了)。否则您将遇到与我一样的问题。我的backgroundworker将继续重复以前的运行。如果运行一次就可以了。它重复了两次上次运行和当前运行。第三次运行将重复最后两次和当前运行。等等。但是如何将值传递到RunWorkerAsync?@missReclusive转换“genericlist”项,即,让我们说“参数1”是int类型,然后是int argument1=(int)genericslist[0]这在维护方面是个坏主意。您应该使用具体类型而不是List,因为至少您可以了解自己在做什么(请参见下面回答中的一个示例)。我可能更喜欢Tuple
(或专门类)而不是泛型对象列表+1。以这种方式发送参数还可以避免每次运行都必须启动新的backgroundworker以避免重复(至少在我的应用程序中)。请参阅下面与此问题相关的我的评论。此外,我的强制转换失败\u dirs=(string[])e.Argument;
,但此\u dirs=e.Argument为string[];
函数。角色转换尝试转换到接口,代码符合…非常感谢!