Jef*_*ang 32 .net c# multithreading asynchronous backgroundworker
BackgroundWorker对象允许我们将单个参数传递给DoWorkEventHandler.
// setup/init:
BackgroundWorker endCallWorker = new BackgroundWorker();
endCallWorker.DoWork += new DoWorkEventHandler(EndCallWorker_DoWork);
...
endCallWorker.RunWorkerAsync(userName);
// the handler:
private void EndCallWorker_DoWork(object sender, DoWorkEventArgs e)
{
string userName = e.Argument as string;
...
}
Run Code Online (Sandbox Code Playgroud)
要传递多个参数,我必须将它们包装在一个对象中,就像这个可怜的字符串数组:
// setup/init:
BackgroundWorker startCallWorker = new BackgroundWorker();
startCallWorker.DoWork += new DoWorkEventHandler(StartCallWorker_DoWork);
...
startCallWorker.RunWorkerAsync(new string[]{userName, targetNumber});
// the handler:
private void StartCallWorker_DoWork(object sender, DoWorkEventArgs e)
{
string[] args = e.Argument as string[];
string userName = args[0];
string targetNumber = args[1];
}
Run Code Online (Sandbox Code Playgroud)
是否有另一个对象或模式允许我们很好地传递多个参数,或者理想情况下,编写我们自己的签名?
Ben*_*n M 45
你可以使用一个闭包(Lambda):
backgroundWorker.DoWork += (s, e) => MyWorkMethod(userName, targetNumber);
Run Code Online (Sandbox Code Playgroud)
或者使用delegate(匿名方法)语法:
backgroundWorker.DoWork +=
delegate(object sender, DoWorkEventArgs e)
{
MyWorkMethod(userName, targetNumber);
};
Run Code Online (Sandbox Code Playgroud)
Vij*_*tel 12
使用打字对象有什么问题?
internal class UserArgs
{
internal string UserName { get; set; }
internal string TargetNumber { get; set; }
}
var args = new UserArgs() {UserName="Me", TargetNumber="123" };
startCallWorker.RunWorkerAsync(args);
Run Code Online (Sandbox Code Playgroud)