【问题标题】:How to call a long method in a new thread to keep the UI running in C# [duplicate]如何在新线程中调用长方法以保持 UI 在 C# 中运行 [重复]
【发布时间】:2013-02-07 21:51:38
【问题描述】:

我有一个 WPF 应用程序,其中包含一个填充用户的组合框、一个显示所选用户的一些数据的网格和一个调用 DoTimeSheetReport() 的按钮。

DoTimeSheetReport() 做了一些工作,然后打开一个带有 SSRS 报告的新窗口。一切正常,但该方法需要很长时间才能完成,主要是因为报告,这意味着我的 UI 变得无响应。我尝试了几种方法来启动一个新的线程/任务,但它们都阻塞了 UI 的线程。我可能做错了什么,但我不知道。

为了不阻塞 UI,调用长方法的最佳方法是什么?

编辑

我更改了代码以隔离耗时的部分。

reportViewer.SetPageSettings(reportConfiguration.PageSettings);

在这部分使用 backgroundWorker 做到了。感谢您的帮助。

@LuisQuijada:那行得通,发布一个答案,以便我接受。

【问题讨论】:

  • 你能展示你当前的代码在做什么(开始一个新线程吗?)
  • 你试过用异步调用替换你的调用吗?
  • 使用后台工作者。见其他SO thread
  • @LuisQuijada 成功了,发布一个答案,以便我接受。
  • @fhlamarche 很高兴它成功了!不幸的是我不能在这里发布任何东西......

标签: c# wpf multithreading user-interface reporting-services


【解决方案1】:
using System.Threading;
new Thread(() => 
{
    Thread.CurrentThread.IsBackground = true; 
    /* run your code here */ 
    Console.WriteLine("Hello, world"); 
}).Start();

【讨论】:

  • 好吧,让我试试。
  • 那是一些丑陋的代码......
  • 不,它给了我“调用线程必须是 STA,因为许多 UI 组件都需要这个”,就像我尝试的几种方法一样。
  • @fhlarche - 如果您从要放入线程的代码中调用 UI 元素,那么您将收到此错误消息。研究使用事件和调度程序来编组来自后台工作线程的 UI 调用。
  • @ChrisF 我的方法不使用它的任何父级成员。它使用 reportViewer 实例化一个新窗口,然后调用 .Show()
【解决方案2】:

简而言之:你需要做的是看看如何使用异步调用

作为开始,您可以查看您的帖子和/或 MSDN 文章中的建议链接:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-17
    • 2018-06-03
    • 2017-12-21
    • 1970-01-01
    • 2011-12-22
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多