将参数传递给委托
passing parameters to delegate
我想用不同的错误消息更改 Windows 表单文本框中的文本。这些错误消息使用相同的方法设置为输出字符串,但我无法将字符串作为参数传递。
以下是我如何调用新的 backgroundworker 来安全地更改文本框中的文本:
worker.DoWork += worker_DoWork;
worker.RunWorkerAsync(argument: error));
然后我尝试调用调用:
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
string output = e.Argument.ToString();
object[] par = new object[] { output };
Delegate del = new DELEGATE(changeErrortext);
this.Invoke(del,par);
}
private void changeErrorText()
{
textBoxError.Text = output.ToString();
}
我想我必须将对象中的 output
分配给 changeErrorText
中的对象,但我真的不知道该怎么做。
我尝试了不同的方法,但 none 奏效了。我是 C# 的新手,请告诉我我是否以及在哪里搞砸了。
实例化必要的事件处理程序
将事件处理程序放在窗体的构造函数中。例如:
public Form1()
{
InitializeComponent(); // Standard initialization component method...
backgroundWorker1.DoWork += backgroundWorker1_DoWork;
backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
}
使用 DoWork 和 RunWorkerCompleted 事件
您使用 'worker.DoWork += worker_DoWork;' 的方式应该通过 "RunWorkerCompleted" 事件进行扩展。操作的 DoWork 事件和处理已完成操作的 RunWorkerCompleted。当您想使用取消或异常处理时,此事件也很有用。这也会自动调用,因此不需要专用的 "changeErrorText" 方法。示例代码:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
label1.Text = e.Result.ToString();
}
您不必使用委托来传递参数
可以按照您编写 RunWorkAsync 的方式传递参数。您可能唯一想做的就是将该方法放在 (click) 事件中。例如:
private void button1_Click(object sender, EventArgs e)
{
int value = 123; // example input
backgroundWorker1.RunWorkerAsync(argument: value);
}
完整代码文档:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.DoWork += backgroundWorker1_DoWork;
backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
}
private void button1_Click(object sender, EventArgs e)
{
int value = 123;
backgroundWorker1.RunWorkerAsync(argument: value);
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
string output = e.Argument.ToString();
e.Result = output;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
label1.Text = e.Result.ToString();
}
}
希望以上解释对您有所帮助。
来源
- Sending Arguments To Background Worker?;
- https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.backgroundworker?view=netcore-3.1
我想用不同的错误消息更改 Windows 表单文本框中的文本。这些错误消息使用相同的方法设置为输出字符串,但我无法将字符串作为参数传递。
以下是我如何调用新的 backgroundworker 来安全地更改文本框中的文本:
worker.DoWork += worker_DoWork;
worker.RunWorkerAsync(argument: error));
然后我尝试调用调用:
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
string output = e.Argument.ToString();
object[] par = new object[] { output };
Delegate del = new DELEGATE(changeErrortext);
this.Invoke(del,par);
}
private void changeErrorText()
{
textBoxError.Text = output.ToString();
}
我想我必须将对象中的 output
分配给 changeErrorText
中的对象,但我真的不知道该怎么做。
我尝试了不同的方法,但 none 奏效了。我是 C# 的新手,请告诉我我是否以及在哪里搞砸了。
实例化必要的事件处理程序
将事件处理程序放在窗体的构造函数中。例如:
public Form1()
{
InitializeComponent(); // Standard initialization component method...
backgroundWorker1.DoWork += backgroundWorker1_DoWork;
backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
}
使用 DoWork 和 RunWorkerCompleted 事件
您使用 'worker.DoWork += worker_DoWork;' 的方式应该通过 "RunWorkerCompleted" 事件进行扩展。操作的 DoWork 事件和处理已完成操作的 RunWorkerCompleted。当您想使用取消或异常处理时,此事件也很有用。这也会自动调用,因此不需要专用的 "changeErrorText" 方法。示例代码:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
label1.Text = e.Result.ToString();
}
您不必使用委托来传递参数
可以按照您编写 RunWorkAsync 的方式传递参数。您可能唯一想做的就是将该方法放在 (click) 事件中。例如:
private void button1_Click(object sender, EventArgs e)
{
int value = 123; // example input
backgroundWorker1.RunWorkerAsync(argument: value);
}
完整代码文档:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.DoWork += backgroundWorker1_DoWork;
backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
}
private void button1_Click(object sender, EventArgs e)
{
int value = 123;
backgroundWorker1.RunWorkerAsync(argument: value);
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
string output = e.Argument.ToString();
e.Result = output;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
label1.Text = e.Result.ToString();
}
}
希望以上解释对您有所帮助。
来源
- Sending Arguments To Background Worker?;
- https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.backgroundworker?view=netcore-3.1