Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t通过UI控件';值作为Task.Factory.StartNew内方法的参数_C#_Wpf_Multithreading_Task - Fatal编程技术网

C# Can';t通过UI控件';值作为Task.Factory.StartNew内方法的参数

C# Can';t通过UI控件';值作为Task.Factory.StartNew内方法的参数,c#,wpf,multithreading,task,C#,Wpf,Multithreading,Task,我正处于多线程的学习过程中,所以当我在使用Task类时,我注意到调用Task.Factory.StartNew方法时出现了一些奇怪的行为(对我来说)。我在WPF应用程序中做了一些示例,我只是尝试在单击按钮时从任务调用一个方法,我所做的是: Task.Factory.StartNew(() => OrderTickets(numberOfTicktes, cbMovieName.Text)); 但是,从未调用OrderTickets方法。然后我更改了代码,如下所示: string movi

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

Task.Factory.StartNew(() => OrderTickets(numberOfTicktes, cbMovieName.Text));
但是,从未调用OrderTickets方法。然后我更改了代码,如下所示:

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

在这次更改之后,我的方法“OrderTickets”被调用,正如我所期望的那样。我在这里的问题是,为什么我不能直接在TaskStartNew方法中使用UI控件的值,就像我在combobox中尝试的那样?我猜,这是因为UI控件由UI线程持有,但并不十分确定。有人能解释一下这里到底发生了什么吗?你能给我指一下描述这一点的Microsoft文档吗?

这不是很明显,但问题是你遇到了两个问题,它们的交互方式有点混乱

问题1-您无法访问外部的控件

第2期-StartNew没有达到您预期的效果<代码>继续使用可能会对此有所帮助


最终结果是,在您看来,调用失败而没有抛出异常。

如果您的代码可以说话,这就是您正在做的:

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

主线程现在是空闲的,稍后(或立即)一个池线程开始执行此工作并注意到:

cbMovieName.Text
因此,它试图与
cbMovieName
通信,但线程(在您的情况下是主线程或UI线程)介入并说:

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

在池线程上引发异常,但不会冒泡。因此,在你看来,它似乎从未被调用,但上述所有的事情都发生了

在另一种情况下,您有:

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

它可以工作,因为池线程不需要任何UI控件。

我不确定,但
任务.工厂.开始新(()=>订单(numberoftickets,cbMovieName.Text))
这必须正常工作?这是个好问题。虽然您可以轻松地在谷歌上搜索其他StackOverflow问题/答案,WPF不允许从控件上的UI线程以外的其他线程进行读取访问,而且WPF对此保持沉默,但我找不到MSDN上的任何信息。您是否可以重新表述您的问题,以便它要求提供指向Microsoft文档的链接?这将是相互测试。可能的副本作为旁白,您可能无论如何都想要。否-其他线程的写访问没有例外(除非类像ObservableCollection一样严格禁止)。这可以在99.99%的情况下工作,直到有一个用户不这样做,并且你重构了一个应用程序来使用Dispatcher everywhere:)谢谢你的解释!如果你这么简单的说,这对理解事物是如何工作的真的很有帮助。我的猜测是准确的,但不知道引擎盖下发生了什么。好极了!
string movieName = cbMovies.Text;
() => OrderTickets(numberOfTicktes, movieName)