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线程上运行。这没关系,当你真正创建一个线程时,它不太可能正常工作。