【发布时间】:2020-12-29 19:39:07
【问题描述】:
我在 Windows Form App(.NET) 中有一种方法,我在其中进行 Rest 调用,反序列化对象中的 json 并在 UI 中显示结果。
所以我将相同的方法从 Windows Form App(.NET) 复制到新的 WPF App(.NET),但 Rest 响应时间发生了变化。 p>
这里是 Rest 响应时间:
Windows Form App(.NET) 以毫秒为单位
WPF App(.NET) 以毫秒为单位
Windows Form App(.NET)中的方法:
private Stopwatch Stopwatch = new Stopwatch();
public Uri url = new Uri("http://xxx.xxx.xxx.xxx");
private readonly HttpClient _client;
//constructor
public Main()
{
_client = new HttpClient();
_client.BaseAddress = url;
var contentType = new MediaTypeWithQualityHeaderValue("application/json");
_client.DefaultRequestHeaders.Accept.Add(contentType);
timer.Start();
timer.Interval = 1;
}
public void Timer_Tick(object sender, EventArgs e)
{
timer.Stop();
try
{
string JsonD= @"{""bal"":{""bla"":0},""data"":{""bla"":""bla""}}";
_stopwatch.Restart();
//JsonD is string fot HttpContent
var contentData = new StringContent(JsonD);
using (var responseMessage = _client.PostAsync("/xxx/xxx/xxx", contentData).Result)
{
if (responseMessage.IsSuccessStatusCode)
{
string strContext = responseMessage.Content.ReadAsStringAsync().Result;
var result= System.Text.Json.JsonSerializer.Deserialize<Dis>(strContext);
}
}
_stopwatch.Stop();
txbRestResp.Text = _stopwatch.ElapsedMilliseconds.ToString();
catch (Exception ex)
{
MessageBox.Show(ex.StackTrace.ToString() + " - " + ex.Message);
}
timer.Start();
}
WPF App(.NET)中的方法:
private Stopwatch Stopwatch = new Stopwatch();
public MainWindow()
{
InitializeComponent();
BgWorker = new BackgroundWorker { WorkerReportsProgress = true };
BgWorker.DoWork += ResetAll;
}
private void ResetAll(object sender, DoWorkEventArgs e)
{
while (true)
{
_stopwatch.Restart();
Display();
_stopwatch.Stop();
lblRestResponse.Content = _stopwatch.ElapsedMilliseconds.ToString();
}
}
private void Display()
{
string JsonD= @"{""bal"":{""bla"":0},""data"":{""bla"":""bla""}}";
string BaseUrl = "http://xxx.xxx.xxx.xxx";
StringContent httpContentDistanza = new StringContent(JsonD);
using var client = new HttpClient { BaseAddress = new Uri(BaseUrl) };
using var responseMessage = client.PostAsync("/xxx/xxx/xxx", httpContentDistanza).Result;
if (responseMessage.IsSuccessStatusCode)
{
string strContext = responseMessage.Content.ReadAsStringAsync().Result;
var result = System.Text.Json.JsonSerializer.Deserialize<Dis>(strContext);
}
}
为什么反应之间有这么大的差异? 现在我在 WPF App(.NET) 中工作,我需要像在 Windows Form App(.NET) 中一样获得相同的 Rest 响应。我期待 WPF 应该更好。
我做错了吗?
有什么建议/改进吗?
【问题讨论】:
-
不确定有多大影响,但您在 WPF 的计时器进程中包含了
HttpClient的创建,但它已在您的 WinForms 应用程序中创建。尝试将HttpClient的创建移到您的主要方法中。另外,请确保您没有重新创建多个HttpClients(看起来不像是)。见:docs.microsoft.com/en-us/azure/architecture/antipatterns/… -
您可以考虑在 WPF 中从
BackgroundWorker切换到 async/await。请参阅:How to run and interact with an async Task from a WPF gui 和 Async/await vs BackgroundWorker,特别是 this answer。 -
其实我有超过5种方法,比如Display()。我把它放在无限循环中,因为如果 Rest 调用的结果发生变化,我需要知道每一刻。如果结果发生变化,我需要进行一些操作。所以在某种程度上是审问......