将参数传递给委托

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();
        }
    }

希望以上解释对您有所帮助。

来源

  1. Sending Arguments To Background Worker?;
  2. https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.backgroundworker?view=netcore-3.1