【发布时间】:2018-03-12 00:36:25
【问题描述】:
我正在学习多线程,所以当我在玩 Task 类时,我注意到调用 Task.Factory.StartNew 方法时出现了一些奇怪的(对我来说)行为。我在 WPF 应用程序中做了一些示例,我只是尝试在单击按钮时从 Task 调用一个方法,而我所做的是:
Task.Factory.StartNew(() => OrderTickets(numberOfTicktes, cbMovieName.Text));
但是,OrderTickets 方法从未被调用过。然后我像这样更改了我的代码:
string movieName = cbMovies.Text;
Task.Factory.StartNew(() => OrderTickets(numberOfTicktes, movieName ));
在此更改之后,我的方法“OrderTickets”被按预期调用。我的问题是为什么我不能直接在 Task StartNew 方法内部使用 UI 控件的值,就像我尝试使用组合框一样?我猜,这是因为 UI 控件由 UI 线程持有,但不太确定。谁能向我解释这里到底发生了什么?你能指点我描述这个的微软文档吗?
【问题讨论】:
-
我不确定,但
Task.Factory.StartNew(() => OrderTickets(numberOfTicktes, cbMovieName.Text))这必须正常工作? -
这是个好问题。虽然您可以轻松地搜索其他 StackOverflow 问题/答案,即 WPF 不允许从控件上的 UI 线程以外的其他线程进行读取访问,并且 WPF 对此保持沉默,但我在 MSDN 上找不到任何信息。您能否重新表述您的问题,因此它要求提供指向 Microsoft 文档的链接?这会很有趣。
-
顺便说一句,你可能想要to avoid StartNew。
-
否 - 来自其他线程的写访问没有例外(除非一个类像 ObservableCollection 一样严格禁止它)。这可以在 99.99% 的情况下工作,直到对于一个用户它不起作用,并且您重构一个应用程序以在任何地方使用 Dispatcher :)
标签: c# wpf multithreading task