Как отправить больше аргументов в С# backgroundworker с измененным событием

Я понимаю, как мы можем передать одну переменную (progresspercentage) в функцию "progresschanged", например.

backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);

...

worker.ReportProgress(pc);

...

private void backgroundWorker1_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
   this.progressBar1.Value = e.ProgressPercentage;
}

Но я хочу передать больше переменных этой функции, например:

worker.ReportProgress(pc,username,score);

...

private void backgroundWorker1_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
   this.progressBar1.Value = e.ProgressPercentage;
   this.currentUser.Value = e.UserName;  //as string
   this.score.Value = e.UserScore;  //as int
}

Извините, я новичок в С#, мог бы кто-нибудь дать мне пример.

Ответ 1

Метод ReportProgress компонента рабочего компонента перегружен, чтобы передать процент и значение типа типизированного объекта:

public void ReportProgress(int percentProgress, Object userState)

В вашем требовании к использованию вы можете объединить имя пользователя и счетчик с разделителем char и, таким образом, передать несколько значений внутри параметра userState; и разбить их внутри события ProgressChanged(), когда он поднят. Вы также можете создать небольшой класс, основанный на свойствах, заполнить его значениями и передать с помощью параметра, заданного пользователем userState.

В качестве примера примера использования перегруженного метода ReportProgress обратитесь к следующей ссылке MSDN:

http://msdn.microsoft.com/en-us/library/a3zbdb1t.aspx

Ответ 2

Если кто-то ищет исчерпывающий ответ:

  1. Быстрый и простой подход будет object[] как в:

    worker.ReportProgress(i, new object[] { pc, username, score });
    
  2. Быстрый и безопасный для типа подход будет System.Tuple<> как в:

    worker.ReportProgress(i, new System.Tuple<object, string, float>(pc, username, score));
    
  3. Лучше всего будет написать свой собственный класс (или, возможно, унаследовать от System.Tuple<>).

    public class PcUsernameScore
    {
        public object PC;
        public string UserName;
        public float Score;
        public PcUsernameScore(object pc, string username, float score)
        {
            PC = pc; Username = username; Score = score;
        }
    }
    

    или же

    public class PcUsernameScore : System.Tuple<object, string, float>
    {
        public PcUsernameScore(object p1, string p2, float p3) : base(p1, p2, p3) { }
    }
    

    иметь что-то вроде:

    worker.ReportProgress(i, new PcUsernameScore(pc, username, score));
    

- С# 7.1

  1. Особенность Inferred Tuple:

    worker.ReportProgress(i, (pc: "pc", username: "me", score: 0));

Ответ 3

Создайте объект передачи данных со свойствами для элементов, которые вы хотите передать, и затем передайте их как пользовательское состояние. В мире OO ответ почти всегда заключается в создании другого объекта.