Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# 但是,在创建自定义messagebox时使用dispatcher无法读取返回值_C#_Wpf_Multithreading_If Statement_Dispatcher - Fatal编程技术网

C# 但是,在创建自定义messagebox时使用dispatcher无法读取返回值

C# 但是,在创建自定义messagebox时使用dispatcher无法读取返回值,c#,wpf,multithreading,if-statement,dispatcher,C#,Wpf,Multithreading,If Statement,Dispatcher,WPF-C# 我有一个相当大的问题。这是因为我开发了一个自定义messagebox,它可以完美地在正常线程上运行。但是,在后台线程中,它抛出一个错误,表示STA线程需要调用它。为了解决这个问题,你可以把整个事情都安排好。但这本身就造成了一个问题,因为如果用户单击“是”,而你下载了一个文件或做了一些事情,它就会冻结或挂起用户界面 Dispatcher.Invoke(new Action(() => { if (msgbox.ShowBox("Do you like bacon?", "Qu

WPF-C#

我有一个相当大的问题。这是因为我开发了一个自定义messagebox,它可以完美地在正常线程上运行。但是,在后台线程中,它抛出一个错误,表示STA线程需要调用它。为了解决这个问题,你可以把整个事情都安排好。但这本身就造成了一个问题,因为如果用户单击“是”,而你下载了一个文件或做了一些事情,它就会冻结或挂起用户界面

Dispatcher.Invoke(new Action(() => 
{
if (msgbox.ShowBox("Do you like bacon?", "Question") == "1")
msgbox.ShowBox("Yes");
else
msgbox.ShowBox("No");
}));
为了解决这个问题,我尝试了以下方法:

if ((string)Dispatcher.Invoke(new Action(() => { msgbox.ShowBox("Update", "An update has been found, would you like to update now?"); })) == "1")
但是,问题在于,如果调度程序无法接收来自messagebox的响应,则会导致代码认为每次都单击了no或cancel

我一直在试图找到一种方法,将我的messagebox线程更改为它的STA线程,但没有查看。对于这段代码中的一些UI元素,我总是从STA线程中得到必须调用的消息

public msgbox()
{
   InitializeComponent();
}
如果你能想出一个解决我头痛的问题的办法,我将不胜感激。这很烦人,因为每次我想做一个mesagebox的时候,它都得去玛瑙。最后一件事是我从我的WFA项目中复制了messagebox代码,这个项目是我第一个合适的WPF项目。在WFA中,MessageBox在后台工作者中工作,没有任何问题,并且不需要调用或任何操作

我也不想定义字符串响应;每一次都是因为这也很混乱:

string response = "nothing";
if ((string)Dispatcher.Invoke(new Action(() => { response = msgbox.ShowBox("Update", "An update has been found, would you like to update now?"); })) == "1")

编辑:我想我找到了一个解决方案。

使用中间人线程创建消息框,并使它们在原始表单UI线程上运行。

我这样做是因为我的后台工作线程中的许多代码确实需要用户在过程中从是或否中选择选项。很难想象还有其他的wey能完成这样的任务,有些是在循环代码中完成的。它可能会问“这是正确的文件夹吗?”如果用户单击“否”,它会继续搜索。这种类型的东西。“这很烦人,因为每次我想做一个mesagebox的时候,它都得去玛瑙。”但是,是的,这是你必须做的事情(可能很少有帮助者的方法可以帮助你)。UI是单线程的。WFA应用程序确实可以工作,因为MessageBox.Show()没有勾选(错误),但即使在那里也是错误的(尝试从后台线程在MessageBox中键入CTRL+C)。-1,给出一个代码示例来帮助解决此问题,而不仅仅是一行建议。练习你的答案,你会得到+1。