C# 如何在新线程中调用long方法以保持UI在C中运行#

C# 如何在新线程中调用long方法以保持UI在C中运行#,c#,wpf,multithreading,user-interface,reporting-services,C#,Wpf,Multithreading,User Interface,Reporting Services,我有一个WPF应用程序,其中有一个填充了用户的组合框、一个显示所选用户的一些数据的网格和一个调用DoTimeSheetReport()的按钮 DoTimeSheetReport()执行一些工作,然后打开一个包含SSRS报告的新窗口。一切正常,但该方法需要很长时间才能完成,主要是因为报告,这意味着我的UI没有响应。我尝试了几种方法来启动一个新的线程/任务,但是它们都阻塞了UI的线程。我可能做错了什么,但我不知道 为了不阻塞UI,调用长方法的最佳方法是什么 编辑 我更改了代码以隔离耗时的部分 rep

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

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

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

编辑

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

reportViewer.SetPageSettings(reportConfiguration.PageSettings);
在这一部分使用了后台工作人员。谢谢你的帮助


@路易斯奎贾达:那就行了,贴一个答案,这样我就可以接受了

简而言之:您需要做的是了解如何使用异步调用

using System.Threading;
new Thread(() => 
{
    Thread.CurrentThread.IsBackground = true; 
    /* run your code here */ 
    Console.WriteLine("Hello, world"); 
}).Start();
首先,您可以查看您的帖子和/或MSDN文章中的建议链接:


您能否显示当前代码正在执行的操作(启动新线程?)您是否尝试用异步调用替换您的调用?请使用后台工作程序。看到另一个@LuisQuijada成功了,发布一个答案,这样我就可以接受了。@fhlamarche很高兴它成功了!不幸的是,我不能在这里发布任何东西……好吧,让我试试。这是一些难看的代码……不,它给了我“调用线程必须是STA,因为许多UI组件都需要STA”,就像我尝试过的几个方法一样。@fhlamarche-如果您是从要放入线程的代码中调用UI元素,那么您将收到此错误消息。研究如何使用事件和分派器封送来自后台工作线程的UI调用。@ChrisF My方法不使用任何其父级成员。它使用reportViewer实例化一个新窗口,只需调用.Show()