Уместно ли использовать BackgroundWorker для выполнения работы, которая вызывает событие, которое я слушаю - PullRequest
2 голосов
/ 22 января 2011

Я новичок в Threading, но я читал темы здесь на BackgroundWorker (BW) и в основном разбираюсь в материале.Я подозреваю, что BW не является правильным решением, но позвольте мне спросить.У меня есть объект (эмулятор GPS), который выполняет свою работу в цикле, в основном ожидающем (Thread.Sleep ()), но иногда вызывающем событие, которое пользовательский интерфейс прослушивает.Конечно, я хочу, чтобы интерфейс был отзывчивым, поэтому было бы неплохо поместить работу объекта в фоновом режиме (как в gps.Start ()).На интерфейсе я хочу иметь возможность приостановить, возобновить и остановить GPS.Я подумал, что мог бы сделать это, установив соответствующие флажки в объекте GPS, которые могли бы нарушить цикл, работающий в фоновом режиме.Чего я не понимаю, так это того, что происходит с событиями, которые вызывает GPS.Поток, в котором вызывается событие, не является потоком, который слушает, и поэтому кажется, что пользовательский интерфейс не может правильно реагировать (как при рисовании новой точки GPS в пользовательском интерфейсе).Я что-то упускаю из-за BW или есть лучший (но все же простой) способ сделать это?

Ответы [ 2 ]

3 голосов
/ 22 января 2011

Я думаю, вы можете использовать событие ProgressChanged в BackgroundWorker для мониторинга этого события в вашем собственном потоке.

Обновление Если вы хотите передать пользовательскую информацию, такую ​​как GeoCordinates, в поток основного пользовательского интерфейса, вы можете сделать это, используя перегруженный метод ReportProgress (Int32 progresszed, object userstate) метод.

Пример:

Это всего лишь пример, измените его в соответствии с вашими требованиями

Создайте класс для хранения кординатов:

public class Position
{
    public int Lat{get;set;}
    public int Long {get;set;}
}

В вашем DoWork метод делает что-то вроде этого:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    //Perform what ever is your task and when you get somthing like a GeoPosition cordinate 
    Position pos = new Position(); 
    pos.Lat = 100; 
    pos.Long = 200; // just some position data
    //pass it on to progress changed event
    //any integer between 0 to 100 that tells how much you have done or just pass 0
    backgroundWorker1.ReportProgress( 0, pos);       
}

в вашем прогрессе изменен обработчик событий:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
        //retrieve position from userstate
        Position pos = e.UserState as Position;
        some_counter_or_progressbar.Value = e.ProgressPercentage;
        textboxLatitude.Text = pos.Lat.ToString();
        textboxLongitude.Text = pos.Long.ToString();
}

Я уверен, что вы получили идею ...

0 голосов
/ 22 января 2011

Так что, если я правильно понял, события, запускаемые эмулятором GPS, приводят к обновлению пользовательского интерфейса, и вы хотите иметь возможность контролировать работу эмулятора GPS из своего пользовательского интерфейса.Если это действительно правильно, я бы использовал событие WaitHandle, автоматическое или ручное, в зависимости от ситуации

...