【发布时间】: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