将参数传递给委托

时间:2020-05-07 17:06:34

标签: c# parameters invoke

我想用不同的错误消息更改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分配给changeErrorText中的对象,但是我真的不知道该怎么做。

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

1 个答案:

答案 0 :(得分:0)

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

将事件处理程序放置在窗体的构造函数中。例如:

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. Sending Arguments To Background Worker?;
  2. https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.backgroundworker?view=netcore-3.1