Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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# 调用的正确使用_C#_Winforms_Backgroundworker_Invoke - Fatal编程技术网

C# 调用的正确使用

C# 调用的正确使用,c#,winforms,backgroundworker,invoke,C#,Winforms,Backgroundworker,Invoke,我有一个关于invoke用法的一般性问题。我的大多数WinC窗体项目都有一个backgroundworker,显然还有一个UI。很快我意识到我需要backgroundworker中的UI信息,或者我需要更改backgroundworker中的UI。 例如: 我的意思是,我的代码中充满了invoke方法。这有什么不好的地方吗?有没有更好的方法来做到这一点。所有控件都将位于同一个UI线程上-与表单本身相同,因此不需要进行多次调用-您可以使用更简单的语法: private void changeSta

我有一个关于invoke用法的一般性问题。我的大多数WinC窗体项目都有一个backgroundworker,显然还有一个UI。很快我意识到我需要backgroundworker中的UI信息,或者我需要更改backgroundworker中的UI。 例如:


我的意思是,我的代码中充满了invoke方法。这有什么不好的地方吗?有没有更好的方法来做到这一点。

所有控件都将位于同一个UI线程上-与表单本身相同,因此不需要进行多次调用-您可以使用更简单的语法:

private void changeStatus(string statusTextV, bool enableProgressBar) { Invoke((MethodInvoker)delegate { statusTxt.Text = statusTextV; progressBar.MarqueeAnimationSpeed = enableProgressBar ? 1 : 0; }); }
所有控件都将位于同一UI线程上—与表单本身相同,因此无需进行多次调用—并且您可以使用更简单的语法:

private void changeStatus(string statusTextV, bool enableProgressBar) { Invoke((MethodInvoker)delegate { statusTxt.Text = statusTextV; progressBar.MarqueeAnimationSpeed = enableProgressBar ? 1 : 0; }); } 您不应该一次又一次地调用,它可以在单个调用中完成。关于正确使用-控件不是线程安全的,是在UI线程上创建的,所以您应该在UI线程中访问它们

假设您正在访问UI线程以外的其他线程中的控件,则必须编写代码来处理同步,并且必须锁定资源和所有对象。

您不应该一次又一次地调用,它可以在单个调用中完成。关于正确使用-控件不是线程安全的,是在UI线程上创建的,所以您应该在UI线程中访问它们


假设您正在访问其他UI线程中的控件,则必须编写代码来处理同步,并且必须锁定资源和所有对象。

这是不是有什么不好的事情?听起来您已经意识到了:。是否有一个更好的方法来实现这一点——是的,Youc/Auth.BTW,如果你必须坚持使用NealJooCK替代调用。前者可能导致GUI主线程死锁。您能给我们提供更多的上下文吗?changeStatus在何处以及如何调用。很快我就意识到我需要来自backgroundworker中UI的信息,为什么需要调用这些信息?您是否使用工人进行长期操作?持续多长时间?分钟小时?天?我很抱歉失去了背景。这个例子并不重要,也不重要背后的程序,它只是一个关于这是否是使用invoke的假定方式的一般性问题。为什么这会构成援引的必要性?这是因为我无法从backgroundworker访问UI,并且我不知道其他方法。我会调查米基德的建议。我无法从backgroundworker访问UI,实际上,您的体系结构应该使这些事情变得不必要。如果您要在UI和底层模型之间创建一个层,让我们称之为viewmodel,那么UI上的所有更新都可以进入viewmodel。而正在处理模型的BackgroundWorker可以简单地从viewmodel中获取所有值,或者收到一些不好的通知—听起来您已经意识到了:。是否有一个更好的方法来实现这一点——是的,Youc/Auth.BTW,如果你必须坚持使用NealJooCK替代调用。前者可能导致GUI主线程死锁。您能给我们提供更多的上下文吗?changeStatus在何处以及如何调用。很快我就意识到我需要来自backgroundworker中UI的信息,为什么需要调用这些信息?您是否使用工人进行长期操作?持续多长时间?分钟小时?天?我很抱歉失去了背景。这个例子并不重要,也不重要背后的程序,它只是一个关于这是否是使用invoke的假定方式的一般性问题。为什么这会构成援引的必要性?这是因为我无法从backgroundworker访问UI,并且我不知道其他方法。我会调查米基德的建议。我无法从backgroundworker访问UI,实际上,您的体系结构应该使这些事情变得不必要。如果您要在UI和底层模型之间创建一个层,让我们称之为viewmodel,那么UI上的所有更新都可以进入viewmodel。而正在处理模型的BackgroundWorker可以简单地从viewmodel获取所有值,或者得到viewmodel的通知……并且必须锁定资源——对于线程安全的GUI来说,即使是锁定也不够。请看,我不确定这个答案是否会增加很多内容。这是MickyD在我最初问题的评论中提出的建议,我一定会研究它……并且必须锁定资源——对于线程安全GUI来说,即使是锁定也不够。看看吧,我不确定这个答案是否能增加很多。这是米基德在我最初问题的评论中提出的建议,我一定会调查的。 private void changeStatus(string statusTextV, bool enableProgressBar) { Invoke((MethodInvoker)delegate { statusTxt.Text = statusTextV; progressBar.MarqueeAnimationSpeed = enableProgressBar ? 1 : 0; }); }