【问题标题】:WPF: How to share a httpClient between windows [closed]WPF:如何在 Windows 之间共享 httpClient [关闭]
【发布时间】:2018-04-16 17:38:02
【问题描述】:

免责声明:我真的是 WPF 新手。

在线查看后,我了解到 HttpClient 应该用作单例,在 WPF 中的窗口之间共享。

但是,我似乎找不到像您在 MVC 中找到的 clear 启动入口点(启动,呵呵!)。

我应该在哪里实例化我的 HttpClient,以及如何跨多个窗口使用它?

目前我有两个窗口;登录和主窗口。两者都非常基本。示例:

public partial class Login : Window
{
    public Login()
    {
        InitializeComponent();
    }

    private void BtnLoginSubmit_Click(object sender, RoutedEventArgs e)
    {

    }
}

在我的 App.xaml.cs 中,我实例化了一个可以从 MainWindow 访问的 HttpClient 对象:

App.xaml.cs:

public partial class App : Application
{
    public HttpClient httpClient { get; set; }
}

MainWindow.xaml.cs:

public partial class MainWindow : Window
    {
        private static ObservableCollection<string> states;

        public static void Add(string state)
        {
            states.Add(state);
        } 

        public MainWindow()
        {
            InitializeComponent();
            ((App)Application.Current).httpClient = new HttpClient();

            states = new ObservableCollection<string>();
            states.Add("Initialized");
            states.CollectionChanged += states_CollectionChanged;
            LblStates.ItemsSource = states;
            Microsoft.Win32.SystemEvents.SessionSwitch += new Microsoft.Win32.SessionSwitchEventHandler(SystemEvents_SessionSwitch);
        }

        static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
        {
            if (e.Reason == SessionSwitchReason.SessionLock)
            {

            }

            MainWindow.Add(e.Reason.ToString());
        }

        void states_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
            {
                LblStates.Items.Refresh();
            }
        }
    }

【问题讨论】:

  • 将其保存在 App 类中并像 public HttpClient HttpClient { get; } = new HttpClient(); 一样初始化它。然后像var client = ((App)Application.Current).HttpClient; 一样从任何你想要的地方访问它。
  • 如果您使用这种 ^ 方法,至少提供 Current 的覆盖,如下所示:public static new App Current { get { return (App)Application.Current; } }
  • 我原以为最简单的是。在 App.xaml.cs 中。公共静态 HttpClient httpClient = new HttpClient();并且您可以将其用作 App.httpClient 而无需任何转换。或者像 glenebob 建议的那样作为一个单独的静态类。
  • 这似乎是一个非常有效的初学者问题。不知道为什么它被搁置。反正微软有specific recommendations about how to initialize and manage the lifetime of an HttpClient

标签: c# wpf singleton httpclient


【解决方案1】:

最基本的方法是添加一个包含 HttpClient 静态实例的静态类。

internal static class HttpClientManager
{
    public static HttpClient Client = InititializeHttpClient();
}

然后您可以从任何地方引用客户端,例如HttpClientManager.HttpClient

【讨论】:

    【解决方案2】:

    我不明白为什么您必须在不同的窗口之间共享 HttpClient - 最好的方法是在需要时调用它,除非需要保留状态。也就是说,您可以在应用程序级别创建您的 HttpClient,并在那里定义一个 HttpClient

    您可以在App.xaml.cs 中定义它,并在必要时重复使用。不一定是静态的,只需要引用具体实例化的实体即可。

    【讨论】:

    • 我会避免以这种方式使用 App,因为它往往会成为这样的事情的包罗万象。此外,对 App (App.Current) 的正常可用引用属于 Application 类型,因此需要强制转换才能获取 App 上声明的实例成员。
    • @glenebob 假设 catch-all 方案仅适用于 HttpClient,我不认为这对于应用程序范围的实体来说是个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    相关资源
    最近更新 更多