gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:04:42 24 4
gpt4 key购买 nike

我正在学习多线程,因此在使用 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 线程持有,但对此不太确定。谁能向我解释这里到底发生了什么?你能告诉我描述这个的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com