gpt4 book ai didi

c# - 使用 BackgroundWorker 来完成引发我监听的事件的工作是否合适

转载 作者:行者123 更新时间:2023-11-30 22:41:33 25 4
gpt4 key购买 nike

我是线程的新手,但我已经阅读了 BackgroundWorker (BW) 上的线程,并且基本上了解了这些 Material 。我怀疑 BW 不是正确的解决方案,但让我问一下。我有一个对象(GPS 模拟器),它在一个循环中工作,主要是等待(Thread.Sleep()),但偶尔会引发 UI 监听的事件。我当然希望 UI 能够响应,所以最好将对象的工作放在后台(如 gps.Start())。在 UI 上,我希望能够暂停、恢复和停止 GPS。我想我可以通过在 GPS 对象中设置适当的标志来打破后台运行的循环来做到这一点。我不明白的是 GPS 引发的事件会发生什么。引发事件的线程不是正在监听的线程,因此 UI 似乎无法正确响应(如在 UI 上绘制新的 GPS 点)。我是否遗漏了一些关于 BW 的东西,或者是否有更好(但仍然简单)的方法来做到这一点?

最佳答案

我想你可以使用 ProgressChanged BackgroundWorker 的事件以在您自己的线程上监视事件。


更新
如果您想将自定义信息(如 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();
}

我相信你有想法......

关于c# - 使用 BackgroundWorker 来完成引发我监听的事件的工作是否合适,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4764996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com