Asp.net 不应该使用实例变量,因为它们会导致多线程读取问题?

Asp.net 不应该使用实例变量,因为它们会导致多线程读取问题?,asp.net,vb.net,coding-style,Asp.net,Vb.net,Coding Style,我知道实例变量不是线程安全的,因为它们存储在堆上。我正在重构ASP.NET单线程应用程序中的代码,并尝试更多地使用实例变量 我的问题是:开发人员是否因为可能的多线程问题而避免使用实例变量?(即使应用程序现在不是多线程的,将来也可能是)。我记得读过这样一篇文章,即应该使用实例变量来改进设计,使用组合和聚合,而不是关联(与局部变量一样) 是否有任何标准可以帮助开发人员决定何时使用实例变量以及何时使用局部变量。我已经在谷歌上搜索了这个,并且查看了MSDN,但我还没有找到我的具体问题的答案。假设您讨论的

我知道实例变量不是线程安全的,因为它们存储在堆上。我正在重构ASP.NET单线程应用程序中的代码,并尝试更多地使用实例变量

我的问题是:开发人员是否因为可能的多线程问题而避免使用实例变量?(即使应用程序现在不是多线程的,将来也可能是)。我记得读过这样一篇文章,即应该使用实例变量来改进设计,使用组合和聚合,而不是关联(与局部变量一样)


是否有任何标准可以帮助开发人员决定何时使用实例变量以及何时使用局部变量。我已经在谷歌上搜索了这个,并且查看了MSDN,但我还没有找到我的具体问题的答案。

假设您讨论的是网页和网页的实例变量,那么您就不必担心多线程和线程安全。asp.net/web服务器将负责此操作。本文将讨论asp.net提供的线程安全性。

您实际上指的是静态变量。静态变量不是线程安全的(通常,除非您编写代码来同步对变量的适当访问)实例相比之下,变量在asp.net中是线程安全的,因为每个请求线程将在其自己的副本上操作


静态变量用于存储需要在所有请求之间共享的数据。如果没有这样的场景,就不需要使用静态变量。如果您这样做了,有些类已经为此提供了功能,例如
缓存
类。

您是否做过任何事情使ASP.NET应用程序成为单线程的?否则,默认情况下它是多踏板的

如果在线程之间共享对象,则实例变量仅是多线程应用程序的问题。对于ASP.NET应用程序来说,每个线程都会创建自己的对象实例,因此多线程不是问题


如果需要在线程之间共享数据,那么将数据封装在对象中仍然是最好的方法。通过使用私有实例变量并通过方法或属性访问它们,您可以确保从对象外部进行的所有访问都是同步的,因为对象中的代码可以完全控制数据的公开位置。

您能举一个代码示例,说明您倾向于使用实例变量的地方吗?@Steven Doggart,谢谢你再次发帖。这是你对我最后一个问题的第二个评论:这让我感到困惑。我决定创建一个新问题,因为对话正在从原来的问题转移。谢谢。实际上,我想知道开发人员在编写代码时是否避免使用实例变量,因为代码中包含包含线程的类,即New Thread()@w0051977。我仍然认为您对
静态变量和
实例变量感到困惑。如果您提供示例代码,我可能能够更好地解释在代码中使用静态变量和实例变量的风险。不过,一般来说,避免在asp.net应用程序中使用静态变量。你会发现在web应用程序中很少需要它们。感谢我在这里的前一篇文章的回答:谈到了使用实例变量线程的限制(问题中有一些代码)。你能看一下吗?+1。我访问此线程是为了表明ASP.NET中的多线程可能是一个问题:@w0051977:关于哪些类型的访问需要同步,这篇文章的结论非常正确。如您所见,ASP.NET应用程序中通常使用的大多数数据不需要同步。即使代码中没有创建线程,实例变量也需要同步吗?@w0051977:您只需要同步可从多个线程访问的数据。这意味着如果启动新线程,或者在处理请求的线程之间共享数据,例如使用静态变量。谢谢。你是说,如果我有一个ASP.NET web应用程序,它调用web服务和外部DLL,但不明确地创建线程,那么应该不会有问题?一旦我得到你的答案,我会将你的答案标记为已接受。