我正在学习多线程的过程中,所以当我在使用 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/