c# - 如何在 WPF 中处理长时间运行的 "thread"?

标签 c# .net wpf multithreading

晚上好!

目前我正在为一些休息服务开发一个 wpf 客户端。与其余服务的通信没有问题,并且在额外的程序集(通信接口(interface))中完成。

基本上:
我有一个以某种方式执行方法的“搜索”按钮。这个方法与服务通信,更新一些文本框和一个进度条(给用户一些图形信息,我们有多远......)。 不幸的是,托管服务的服务器有点蹩脚,导致一些严重的响应时间(大约 4 秒)。另一方面,这导致我的 wpf 应用程序等待,最终导致:变黑,并显示“未响应”...

我已经尝试将此执行放在另一个线程中,但是......合乎逻辑的是我无法访问我的 wpf-window 的控件......

atm 我真的很无助......谁能给我一些处理程序或解决方案?

最佳答案

您的 UI 线程正忙于等待网络服务的响应,无法绘制屏幕。一个不错的选择是将服务请求推送到另一个非 UI 线程。查看BackgroundWorker ,专为简化此操作而设计。它处理从非 UI 到 UI 线程的跨线程调用编码。

大致:

BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync(arg);
...

static void bw_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = (BackgroundWorker)sender;
    int arg = (int)e.Argument;
    e.Result = CallWebService(arg, e);
}

static void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar.Increment();
}

static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    label.Text = "Done: " + e.Result.ToString();
}

关于c# - 如何在 WPF 中处理长时间运行的 "thread"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/900215/

相关文章:

c# - 使用 C#,如何逐行显示 XML?

c# - 如何检测 MouseWheel 事件在 WPF 中结束

c# - 如何等待多个异步操作完成

c# - Canvas 动画 - 不在循环中工作

c# - WPF中不同元素类型列表的布局

javascript - Javascript 确认消息中的新行

c# - Entity Framework + LINQ 缓慢与字符串查询速度?

c# - Win7 : unregister event log from event source

.net - 仅当有 N 个唯一字符时才匹配正则表达式

c# - 如何获取 WPF 中组框中的控件列表