c# - 无法将 UI 控件的值作为参数传递给 Task.Factory.StartNew 内的方法

标签 c# wpf multithreading task

我正在学习多线程的过程中,所以当我在使用 Task 类时,我注意到调用 Task.Factory.StartNew 方法时出现了一些奇怪的(对我来说)行为。我在 WPF 应用程序中做了一些示例,我只是尝试在单击按钮时从任务中调用方法,我所做的是:

Task.Factory.StartNew(() => OrderTickets(numberOfTicktes, cbMovieName.Text));

但是,OrderTickets 方法从未被调用。然后我像这样更改了代码:

string movieName = cbMovies.Text;
Task.Factory.StartNew(() => OrderTickets(numberOfTicktes, movieName ));

在此更改之后,我的方法“OrderTickets”按照我的预期被调用。我的问题是为什么我不能直接在 Task StartNew 方法内部使用 UI 控件的值,就像我尝试使用组合框一样?我的猜测是,这是因为 UI 控件由 UI 线程持有,但对此不太确定。谁能向我解释一下这里到底发生了什么?您能给我指出描述此问题的 Microsoft 文档吗?

最佳答案

如果你的代码会说话,这就是你正在做的事情:

“我是主线程。嘿,调度程序,你能使用池中的线程为我完成这项工作吗?”

() => OrderTickets(numberOfTicktes, cbMovieName.Text)

主线程现在空闲,稍后(或立即)池线程会接手这项工作并注意到这一点:

cbMovieName.Text

因此它尝试与 cbMovieName 通信,但线程(在您的情况下是主线程或 UI 线程)进行干预并表示:

“嘿池线程,为什么你不问我就试图与我的一个控件进行通信?走开!!!(当他翻白眼时)”

异常在池线程上抛出,但没有冒泡。因此,在您看来,它似乎从未被调用过,但以上所有事情都发生了。

在其他情况下,您有这样的情况:

string movieName = cbMovies.Text;
() => OrderTickets(numberOfTicktes, movieName)

它会起作用,因为池线程不需要任何 UI 控制。

关于c# - 无法将 UI 控件的值作为参数传递给 Task.Factory.StartNew 内的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49219663/

相关文章:

wpf - 是否有任何 native WPF 多选组合框可用?

wpf - 将 Tab 键顺序限制为单个用户控件 (WPF)

java - 使用 java ForkJoinPool 调用 JdbcTemplate batchUpdate()

c# - 如何终止挂起的 APM 操作

c# - 检测变量变化c#

c# - 结合MVVM、ORM和一些硬件接口(interface)

c# - ASP.NET MVC - 组织站点/URL

c# - 组合框样式显示评级和描述 WPF

用于浮点值的 C++ 并行 std::sort

java - 使用递归函数进行并行编程?