WPF UI update from BackgroundWorker
本文关键字:BackgroundWorker from update UI WPF | 更新日期: 2023-09-27 18:06:57
试图找到类似的内容,但没有找到。
我有一个类,处理网站ping(保持活力)。此进程在后台运行,并带有ON/OFF触发器。
当"ping"正在运行时,它应该用以下数据更新WPF文本框:1. 加载开始时间2. 装货完成时间3.内容长度和一些更多的信息
我无法从后台工作者访问文本框,因为文本框不是静态的。当我发送TextBox作为参数并从那里更新它时,我收到一个错误,我无法更新TextBox,因为它正在另一个线程上运行。
主要问题是BackgroundWorker一直异步运行,直到它被手动关闭。
我尝试了调度器,也尝试将文本框作为控件作为参数发送,并从那里编辑。
是我的Pinger类的一个片段。谢谢。
class Pinger
{
string urlToPing;
int interval;
BackgroundWorker bw;
public Pinger()
{
urlToPing = Application.Current.Resources["UpdateUrl"].ToString();
interval = int.Parse(Application.Current.Resources["RefreshRate"].ToString());
bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
PingIt();
while (true)
{
if (bw.CancellationPending)
{
e.Cancel = true;
break;
}
else
{
Thread.Sleep(interval * 1000);
PingIt();
}
}
}
private void PingIt()
{
WebRequest req = HttpWebRequest.Create(urlToPing);
WebResponse response = req.GetResponse();
}
public void Start(Control lastUpdateC, Control timeTakenC)
{
bw.RunWorkerAsync();
}
public void ShutDown() {
bw.CancelAsync();
}
}
你需要使用后台worker的Report Progress功能。它将调用从后台线程发送到UI线程。
类似于这样-只需将console更改为文本框。
bw.ProgressChanged += (sender, eventArgs) =>
{
Console.WriteLine(eventArgs.UserState);
};
private static void BwOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
var bw = sender as BackgroundWorker;
bw.ReportProgress(0, "My State is updated");
}