C# 如何在.NET中异步运行报表?
我有一张有网格的表格。网格有一个上下文菜单,其中一个菜单项应为网格中选定的每个项目创建报告。但是,我希望报告在一个单独的线程上运行,并且上下文菜单在单击报告项后几乎立即关闭。我仍在努力理解这整件事。以下是我到目前为止的情况。下面是正在发生的事情。当我点击关联菜单项时,关联菜单显示,然后第一个报告出现,暂停,然后第二个报告出现,暂停,等等。然而,关联菜单直到最后一个报告出现才消失。我并不真的担心报告之间的停顿,但看起来它们是同步处理的。我主要想知道为什么上下文菜单不会立即消失C# 如何在.NET中异步运行报表?,c#,multithreading,asynchronous,reportviewer,C#,Multithreading,Asynchronous,Reportviewer,我有一张有网格的表格。网格有一个上下文菜单,其中一个菜单项应为网格中选定的每个项目创建报告。但是,我希望报告在一个单独的线程上运行,并且上下文菜单在单击报告项后几乎立即关闭。我仍在努力理解这整件事。以下是我到目前为止的情况。下面是正在发生的事情。当我点击关联菜单项时,关联菜单显示,然后第一个报告出现,暂停,然后第二个报告出现,暂停,等等。然而,关联菜单直到最后一个报告出现才消失。我并不真的担心报告之间的停顿,但看起来它们是同步处理的。我主要想知道为什么上下文菜单不会立即消失 void custo
void custodyRptItem_Click(object sender, RoutedEventArgs e)
{
foreach (CustodyItem curItem in CustodyControl.SelectedItems)
{
Dispatcher.BeginInvoke((ShowReportDelegate)ShowChainOfCustodyReport, curItem);
}
}
void ShowChainOfCustodyReport(CustodyItem item)
{
CustodyReport report = new CustodyReport(item);
report.Show();
}
如果在同一DispatcherPriority进行多个BeginInvoke调用,则将按照调用顺序执行这些调用。从 尽管BeginInvoke会立即返回,但所有委托都会在创建Dispatcher的线程上执行,因此它们会彼此同步执行 我假设Dispatcher来自GUI线程,这就是为什么在显示所有报表之前上下文菜单不会消失的原因-消息泵在消息消失之前处理有关执行ShowChainOfCustomyReport的消息,以使菜单消失。顺便说一句,在GUI线程上调用ShowChainOfCustomyReport是件好事,因为您不想在非GUI线程上调用report.Show,或者至少在没有消息泵的线程上调用
要异步执行此操作的唯一原因是为了在报告显示之前菜单消失吗?您是否在调度程序之前尝试在上下文菜单上调用Hide。调用不确定这是否可行,有一段时间没有使用上下文菜单。。。。如果这确实有效,您可能可以删除所有Dispatcher.BeginInvoke代码,直接调用report.Show,因为Show没有阻塞 您可以使用TreadPool:
void custodyRptItem_Click(object sender, RoutedEventArgs e)
{
foreach (CustodyItem curItem in CustodyControl.SelectedItems)
{
ThreadPool.QueueUserWorkItem(ShowChainOfCustodyReport, curItem);
}
}
void ShowChainOfCustodyReport(object context)
{
CustodyItem item = context as CustodyItem;
if (item == null) return;
if (InvokeRequired)
{
Action<object> a = ShowChainOfCustodyReport;
Invoke(a, context);
}
else
{
CustodyReport report = new CustodyReport(item);
report.Show();
}
}
此处未创建线程,ShowChainOfCustomdyReport在UI线程上运行。这没关系,当你真正创建一个线程时,它不太可能正常工作。