Как отправить больше аргументов в C # backgroundworker прогрессирует измененное событие - PullRequest
10 голосов
/ 07 сентября 2011

Я понимаю, как мы можем передать одну переменную (progresspercentage) в функцию «progressaged», например, так:

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
}

извините, я новичок в c #может ли кто-нибудь дать мне пример.

Ответы [ 3 ]

20 голосов
/ 07 ноября 2011

Метод ReportProgress компонента фонового рабочего процесса перегружен для передачи в процентах и ​​типизированного значения состояния объекта:

public void ReportProgress(int percentProgress, Object userState)

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

Для примера использования перегруженного метода ReportProgress см. Ссылку MSDN ниже:

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

14 голосов
/ 26 февраля 2014

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

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

- C # 7.1

Функция Inferred Tuple:

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

7 голосов
/ 07 ноября 2011

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

...