关于在c#WinForms中跨多个表单提供方法的担忧

时间:2016-05-31 19:57:50

标签: c# winforms

我想知道我在多种表格中提供方法的方法是否安全,或者我的方法是否存在我可能不知道的问题。

我目前正在处理一个包含十几种表单的应用程序,并且有许多表单被这些表单调用,所以在每个表单上重新创建它们,我创建了一个名为{{1的新类在这个类中,我创建了一系列我在整个应用程序中调用的类和方法。

我还没有注意到我的设置存在任何问题,但我担心的是,如果我的Globals.cs中的一个方法会被不同的形式同时调用会发生什么?我有无效的方法,写入数据传递到SQL表,我有返回数据的方法。

我在某些形式中使用Globals.cs,如果其中一个方法由两个不同的Worker同时调用,或者在另一个表单上调用Worker和方法调用,会发生什么?

以下是我的Globals.cs类的示例以及其中的一些方法。

BackGroundWorkers

2 个答案:

答案 0 :(得分:1)

原则上,具有全局功能是好的。您需要考虑是否可能由多个线程同时调用函数以及这是否有害。在一个线程中读取值而另一个线程正在更新它就是一个例子。做一些关于使代码线程安全的阅读。

答案 1 :(得分:1)

  1. 在单独的类中使用全局方法或属性没有一般问题。这非常普遍。

  2. 一般来说,您不必担心表格一次做两件事。除非你做了非常具体(和困难)的事情,否则每个表单的事件(点击,按键等)都由整个应用程序中的单个UI线程处理。即使您使用(讨厌的)DoEvents方法也是如此。

  3. 如果您已经完成了将UI线程与工作线程分开的工作(这很常见,通常是个好主意),您可以通过使用简单的lock来阻止对全局函数的同时访问,稍高级critical section,或者使用特定的CLR功能,这取决于你正在做什么(例如,你可以使用Application.Lock来锁定应用程序变量。)

  4. 许多CLR函数都是线程安全的,如果是,你可以调用它们而不必担心锁定。有关CLR功能,请参阅MSDN文档; 99%的时间他们会告诉你这个功能是否是线程安全的。