BackgroundWorker的替代方案,它接受多个参数?

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)

  • 我认为这个解决方案中的警告是,我们失去了在DoWorkEventArgs e中填充Result或Cancel字段的能力.如果你不打算再使用它,那太好了. (2认同)

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)

  • C#4.0具有可以容纳多个args的元组.请参阅我对这个问题的回答. (2认同)