c# - 传递参数给委托
问题描述
我想用不同的错误消息更改 Windows 窗体的文本框中的文本。这些错误消息使用相同的方法设置为输出字符串,但我不能将字符串作为参数传递。
以下是我如何调用新的后台工作人员来安全地更改文本框中的文本:
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
in 对象分配给 in 对象changeErrorText
,但我真的不知道该怎么做。
我尝试了不同的方法,但都没有奏效。我是 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 的方式传递参数。您可能想要做的唯一一件事就是将该方法放在(单击)事件中。例如:
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();
}
}
我希望我对上述解释有所帮助。
来源
推荐阅读
- android - 从另一个活动的堆栈中清除活动
- mongodb - 猫鼬覆盖原始对象而不是更新
- vuetify.js - Vuetify - 组件内部的 CSS 不起作用(生效)
- sql-server - 将查询总和转为排名列
- elasticsearch - logstash 无法从 kafka 正确读取 avro 记录
- tensorflow - Jupyter Notebook 在使用 MaxPool 层时被杀死
- java - 2个线程在java中一次启动
- ethereum - web3.py 中 sendTransaction 和 sendRawTransaction 的区别
- c++ - SDL2 窗口是透明的
- r - How to define blocks of elements in a vector to zero and looping over the next blocks?