是否适合使用BackgroundWorker来完成引发我收听的事件的工作

我是Threading的新手,但是我已经在BackgroundWorker(BW)上阅读了这些主题并且大部分都了解这些内容。我怀疑BW不是正确的解决方案,但让我问一下。 我有一个对象(GPS模拟器),它在一个循环中工作,主要是等待(Thread.Sleep()),但偶尔会引发一个UI监听的事件。我希望UI当然能够响应,所以将对象的工作放在后台会很好(如gps.Start())。在UI上,我希望能够暂停,恢复和停止GPS。我想我可以通过在GPS对象中设置适当的标志来破坏循环在后台运行。我不明白的是GPS引发的事件会发生什么。引发事件的线程不是正在侦听的线程,因此看起来,UI无法正确响应(如在UI上绘制新的GPS点)。 我错过了什么BW或有更好(但仍然很简单)的方式吗?     
已邀请:
我认为您可以使用BackgroundWorker的ProgressChanged事件来监视您自己的线程上的事件。 更新 如果要将GeoCordinates等自定义信息传递给主UI线程,可以使用ReportProgress的重载方法(Int32 progresschanged,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();
}
我相信你有这个想法......     
因此,如果我理解这一点,GPS模拟器发出的事件会导致UI更新,并且您希望能够从UI控制GPS模拟器的运行。如果这确实是正确的,我会根据情况使用事件WaitHandle构造,Auto或Manual     

要回复问题请先登录注册