Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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#_Design Patterns_Web_Singleton - Fatal编程技术网

C# 静态实例是否异步使用?

C# 静态实例是否异步使用?,c#,design-patterns,web,singleton,C#,Design Patterns,Web,Singleton,我已经阅读了很多与此相关的问题,但我没有找到一个可靠的答案,这就是为什么我决定发布我自己的问题 我见过很多实现Singleton设计模式的web应用程序和web服务,但最近我一直在想,没有一个真正的理由说明为什么这应该是一个好主意,让我知道我是否错了 我的猜测是:不,我认为它将对所有请求使用相同的实例,这将使我的代码变慢,并且不会让我利用垃圾收集器 例:请求1调用MethodInstanceInstance,假设需要2秒钟。 请求2调用MethodInstanceInstance直到请求1完成后

我已经阅读了很多与此相关的问题,但我没有找到一个可靠的答案,这就是为什么我决定发布我自己的问题

我见过很多实现Singleton设计模式的web应用程序和web服务,但最近我一直在想,没有一个真正的理由说明为什么这应该是一个好主意,让我知道我是否错了

我的猜测是:不,我认为它将对所有请求使用相同的实例,这将使我的代码变慢,并且不会让我利用垃圾收集器

例:请求1调用MethodInstanceInstance,假设需要2秒钟。 请求2调用MethodInstanceInstance直到请求1完成后才调用该方法,因为该方法已被使用。我可能错了,这就是我的看法,我不知道这是不是真的


我想在web应用程序中使用静态实例的唯一方法可能是,如果静态资源可以异步使用。您认为呢?

静态实例没有什么特别之处,它们的方法与调用方运行在同一线程上

因此,静态实例不会异步使用,除非它们的调用者位于不同的线程上


在web应用程序的上下文中,如果两个用户在相似的时间调用相同的函数(如果该方法不是线程安全的),则很有可能出现争用情况。

当您不想实例化一个对象来运行某个方法时,静态是有用的。考虑这个例子:

public class MyMath
{
  public int sum(int a, int b)
  {
    return a + b;
  }
}
要获得总额,您需要执行以下操作:

  MyMath m = new MyMath();
  int c = m.sum(1, 2);
但是,如果sum是静态的,则可以执行以下操作并避免不必要地创建对象:

  int c = MyMath.sum(1,2);
现在,关于异步使用它:没有理由不能。与非静态类相比,它的线程安全性并不高,尽管对于非静态类,如果需要,您可以在单独的线程中使用单独的实例

编辑:单身汉


当您想要确保一个对象只发生一次实例化时,通常使用单例模式。想要这样做的原因各不相同。我过去曾使用它来限制到资源的连接数。您是否可以异步使用它取决于您的实现。您可以实现锁以防止对一个方法的多个调用同时运行,但您必须具体做到这一点。

当然,它们可以异步使用,可能会出现争用条件和其他问题。当然是通过不同的线程