首页 > 解决方案 > 传递参数给委托

问题描述

我想用不同的错误消息更改 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();
    }

我想我必须将outputin 对象分配给 in 对象changeErrorText,但我真的不知道该怎么做。

我尝试了不同的方法,但都没有奏效。我是 C# 新手,所以请告诉我是否以及在哪里搞砸了。

标签: c#parametersinvoke

解决方案


实例化必要的事件处理程序

将事件处理程序放在表单的构造函数中。例如:

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

我希望我对上述解释有所帮助。

来源

  1. 向后台工作人员发送参数?;
  2. https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.backgroundworker?view=netcore-3.1

推荐阅读