передача параметров делегату - PullRequest
1 голос
/ 07 мая 2020

Я хочу изменить текст в текстовом поле формы 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 голосов
/ 08 мая 2020

Создать экземпляры необходимых обработчиков событий

Поместите обработчики событий в конструктор формы. Например:

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

Вам не нужно использовать делегата для передачи параметров

Параметры можно передавать так, как вы написали RunWorkAsyn c. Единственное, что вы можете сделать, это поместить этот метод в событие (щелчок). Например:

private void button1_Click(object sender, EventArgs e)
{
   int value = 123; // example input
   backgroundWorker1.RunWorkerAsync(argument: value);
}

Полный код c:

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
...