【问题标题】:How to dispatch a lambda expression to a background (non-UI) thread?如何将 lambda 表达式分派到后台(非 UI)线程?
【发布时间】:2013-09-03 21:12:18
【问题描述】:

我希望执行此操作:

Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            ... // do some UI specific stuff
        });

但我不想将 lambda 表达式发送到 UI 线程,而是想将其发送到后台工作人员。

情况就是这样,我有一个消息框,我需要知道它的响应是否需要做一些额外的处理(在这种情况下是复制一个文件)。

如何做到这一点?我愿意接受不包括 lambda 表达式调度的各种重构解决方案。

感谢阅读

【问题讨论】:

  • 所以你的意思是你需要在后台线程中调用一些东西?还是我错过了什么?
  • 不。没有意义。 MessageBox 在 UI 线程上运行,因此当它从其模式显示返回时,您就在 UI 线程上。您将在后台线程(例如 ThreadPool.QueueUserWorkItem)上运行 lambda,然后在完成后使用调度程序返回 UI 线程。但是您需要来自 UI 线程的调度程序;不确定它是否与您在代码中提到的不同。
  • @Will 是的,所以我会研究一下 ThreadPool.QueueUserWorkItem。谢谢
  • @Will QueueUserWorkItem 绝对有效。如果您想回答这个问题,我会将其标记为正确的。再次感谢
  • 您的评论说“UI 特定的东西”。如果它是 UI 的东西,它需要在 UI 线程中。如果它 不是 UI 的东西,那么它可以在非 UI 线程中。

标签: c# .net multithreading windows-phone-8 windows-phone


【解决方案1】:

MessageBox 在 UI 线程上运行,因此当它从其模式显示返回时,您就在 UI 线程上。此时分派给 UI 分派器没有意义。

您希望在后台线程(例如 ThreadPool.QueueUserWorkItem、通过任务等)上运行 lambda,然后在完成后使用调度程序返回 UI 线程。但是您需要来自 UI 线程的调度程序;不确定它是否与您在代码中提到的不同。

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您会看到这样的内容。首先在 UI 线程上显示一个消息框,等待结果,如果需要,将一些工作分派到后台线程:

    Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                //Show messagebox
                var result = MessageBox.Show("Question?", "Title", MessageBoxButton.OKCancel);
    
                //Check messagebox result
                if (result == MessageBoxResult.OK)
                {
                    ThreadPool.QueueUserWorkItem(x =>
                    {
                        //Do some work, transfer a file
                    });
                }
            });
    

    【讨论】:

      猜你喜欢
      • 2012-01-10
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      相关资源
      最近更新 更多