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

关于在c#WinForms中跨多个表单提供方法的担忧,c#,winforms,C#,Winforms,我想知道我在多个表单中提供方法的方法是否安全,或者我的方法是否存在我不知道的可能问题 我目前正在处理一个有十几个表单的应用程序,其中有许多表单调用某些方法,因此我创建了一个名为Globals.cs的新类,并在该类中创建了一系列在整个应用程序中调用的类和方法 到目前为止,我还没有注意到我的设置有任何问题,但我关心的是,如果Globals.cs中的一个方法被不同的表单同时调用,会发生什么情况?我有将传入的数据写入SQL表的void方法,也有返回数据的方法 我在某些表单中使用了BackGroundWo

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

我目前正在处理一个有十几个表单的应用程序,其中有许多表单调用某些方法,因此我创建了一个名为
Globals.cs
的新类,并在该类中创建了一系列在整个应用程序中调用的类和方法

到目前为止,我还没有注意到我的设置有任何问题,但我关心的是,如果Globals.cs中的一个方法被不同的表单同时调用,会发生什么情况?我有将传入的数据写入SQL表的void方法,也有返回数据的方法

我在某些表单中使用了
BackGroundWorkers
,如果其中一个方法同时被两个不同的Worker调用,或者由一个Worker和另一个表单上的方法调用调用,会发生什么情况

下面是我的Globals.cs类的示例和其中的一些方法

class Globals
{
    public static string getUserSetting(string userID, string form, string obj_name)
    {
        string value = "";
            // Get setting value from SQL Table and assign it to return variable
        return value;
    }

    public static void saveUserSetting(string userID, string form, string obj_name, string value)
    {
        // Save Passed in settings to SQL Table
    }

    public static string getEnviro()
    {
        if (!string.IsNullOrEmpty(Settings.Default.EnvironmentDefault))
            return Settings.Default.EnvironmentDefault.ToString();
        else
            return "Live";
    }

    public class Properties
    {
        public static System.Drawing.Color colorPropertyFromString(string stringValue)
        {
            System.Drawing.Color returnValue = System.Drawing.Color.Empty;
            if (!string.IsNullOrEmpty(stringValue))
            {
                int colorIntVal = -1;
                bool output;
                output = int.TryParse(stringValue, out colorIntVal);

                returnValue = System.Drawing.Color.FromArgb(colorIntVal);
            }
            return returnValue;
        }
    }
}


/*
    I use this Class to create new instances of SqlConnections through my application. 
    Example: If I need a new SqlConnection I would go:
    SqlConnection conn = new SqlConnection(Conn.ConnectionString);
*/
public sealed class Conn
{
    public static string ConnectionString = Settings.Default.ArborgConnectionString.ToString();
}

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

原则上,具有全局函数是可以的。您需要考虑是否有可能通过多个线程同时调用函数,这是否有害。例如,在一个线程中读取一个值,而另一个线程正在更新该值。阅读一些关于使代码线程安全的内容

  • 在单独的类中具有全局方法或属性没有一般问题。这是非常普遍的

  • 通常,您不需要担心表单同时做两件事。除非您做了一些非常具体(和困难)的事情,否则每个表单的事件(点击、按键等)都由整个应用程序中的单个UI线程处理。即使你正在使用(讨厌的)方法,这也是正确的

  • 如果您已经完成了将UI线程与工作线程分离的工作(这很常见,而且通常是一个好主意),那么您可以通过使用简单的、稍微高级一点的方法,或者通过使用特定的CLR功能来阻止对全局函数的同时访问,这取决于您正在执行的操作(例如,您可以使用锁定应用程序变量)

  • 很多很多CLR函数都是线程安全的,如果是,您可以调用它们而不用担心锁定问题。请参阅MSDN文档了解CLR函数;99%的时间它们会告诉您函数是否是线程安全的

  • 在一个单独的类中拥有全局方法或属性没有一般问题。这是非常常见的

  • 一般来说,您不必担心表单同时做两件事。除非您做了非常具体(和困难)的事情,否则每个表单的事件(单击、按键等)都由整个应用程序中的单个UI线程处理。即使您使用(讨厌的)方法,这也是正确的

  • 如果您已经完成了将UI线程与工作线程分离的工作(这很常见,而且通常是一个好主意),那么您可以通过使用简单的、稍微高级一点的方法,或者通过使用特定的CLR功能来阻止对全局函数的同时访问,这取决于您正在执行的操作(例如,您可以使用锁定应用程序变量)

  • 很多很多CLR函数都是线程安全的,如果是,您可以调用它们而不用担心锁定问题。请参阅MSDN文档了解CLR函数;99%的时间它们会告诉您函数是否是线程安全的


  • 不确定您遵循的是什么标准和命名约定。我建议您将一些方法和类重命名如下:
    GetUserSetting
    SaveUserSettingGetEnvironment
    ColorPropertyFromString
    连接
    。不确定您使用的是什么标准和命名约定下面。我建议您将一些方法和类重命名如下:
    GetUserSetting
    SaveUserSetting
    GetEnvironment
    ColorPropertyFromString
    连接
    。感谢您提供的链接,一个具有输入参数、分析这些参数并返回一个结果。当一个以上的线程同时调用这样的方法时会发生什么情况?线程2会得到线程1传入的结果吗?还是会创建一个方法实例,每个线程在该实例中返回自己的结果?@Cornelius:如果这些方法(函数)不要修改任何全局变量/对象。它们很好。一个函数可能会被任意数量的并发线程调用,因为它的执行是在该特定线程中完成的。我想你可以说它创建了一个函数的实例,是的。你只需小心在中间线程中的方法中正在更新的资源te被一个线程读取时,因为另一个线程尚未完成更新。除此情况外,多个线程调用同一个方法是可以的。@Ian和Visual Vincent,因此如果一个方法或函数写入传入的信息,让我们假设一个Sql表被不同的线程同时调用,那么它将是一个问题?在这种情况下您可以依靠SQL Server来保证您的安全。它可以处理许多同时发生的请求。感谢您提供的链接,一个具有输入参数、分析这些参数并返回结果的方法如何。当这样的方法被多个线程同时调用时会发生什么情况?线程2会得到线程1传入的结果吗它会创建一个实例吗