gpt4 book ai didi

c# - 单例模式用于创建 Web 服务,但如何处置。

转载 作者:行者123 更新时间:2023-11-30 20:06:19 25 4
gpt4 key购买 nike

我已经使用单例模式创建了我在 win 表单应用程序中使用的 Web 服务的单个实例。我已经看到这对 Web 应用程序来说是一个很好的做法。我想知道 winform 应用程序是否也一样?另外,我是否应该担心处理 Web 服务(即之后的代理对象)——它有一个 .Dispose 方法,但我没有在我的代码中的任何地方调用它。在我的应用程序中,我异步调用所有 Web 方法。这听起来可能很傻,但我不知道我需要在哪里调用 dispose。谁能帮忙?

class ListService
{
private static RetrieveList s_proxy;

private static readonly object s_lock = new object();

private static readonly string s_webServiceURL = Authentication.RetrieveListUrl;

internal static RetrieveList Proxy
{
get
{
lock (s_lock)
{
if (s_proxy == null)
{
s_proxy = new RetrieveList();
s_proxy.Url = s_webServiceURL;
}

return s_proxy;
}
}
}

}

最佳答案

如果您的应用程序只有一个实例,则该对象将在应用程序关闭或崩溃时被销毁。您可以在终结器中调用 Dispose,但不能保证一定会成功。

除非 Dispose 做了一些重要的事情,比如保存你的文档(它不应该),否则我会说,不要太担心。它是一个单例的事实意味着它永远存在并且处理只是为了释放原本会保留的资源。该对象保留在周围,因此没有任何东西可以释放。

然而,有些人可能对此不以为然,并说“如果 Dispose 做了一些对我来说很重要的事情,而不是释放资源怎么办?”。您仍然可以在应用程序运行后调用 Dispose:

static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogAnalizzer());
ListService.Dispose(); // or whatever you're going to call it
}

I have seen that this is good practice for web applications. I was wondering if this is the same for winform apps too?

根据经验,当您的应用程序作为一个整体只需要某物的一个实例时,(线程安全的)单例通常是一个好主意:缓存、数据库连接、代理、应用程序本身、一个记录器。没有任何内容表明单例不应该也适用于您的 WinForm 应用程序。

但是请记住,您必须仔细考虑您的设计。如果您有一个记录器并且文件变得不可访问怎么办?如果代理断开连接怎么办?等等等等

关于c# - 单例模式用于创建 Web 服务,但如何处置。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9945914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com