Как отправить больше аргументов в С# 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
Если кто-то ищет исчерпывающий ответ:
-
Быстрый и простой подход будет object[]
как в:
worker.ReportProgress(i, new object[] { pc, username, score });
-
Быстрый и безопасный для типа подход будет System.Tuple<>
как в:
worker.ReportProgress(i, new System.Tuple<object, string, float>(pc, username, score));
-
Лучше всего будет написать свой собственный класс (или, возможно, унаследовать от 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
-
Особенность Inferred Tuple:
worker.ReportProgress(i, (pc: "pc", username: "me", score: 0));
Ответ 3
Создайте объект передачи данных со свойствами для элементов, которые вы хотите передать, и затем передайте их как пользовательское состояние. В мире OO ответ почти всегда заключается в создании другого объекта.