我与通过这段代码提出的一个问题挣扎:为什么这个异步方法阻塞UI线程?
private int FPS = 60;
void WebView_LoadCompleted(object sender, NavigationEventArgs e)
{
WebviewContentWorker();
}
private async void WebviewContentWorker()
{
WebViewBrush wvb = new WebViewBrush();
wvb.SetSource(WebView);
wvb.Redraw(); //we must redraw at least once before collapsing the WebView
WebView.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
while (true)
{
webViewContent.Background = wvb; //webViewContent is a canvas
await Task.Delay(1000/FPS);
wvb.Redraw();
}
}
我想在这里实现的是找到XAML的WebView
,我觉得很邋遢一种解决方法。我希望能够在其上绘制东西,但我不能这样做,我基本上在做的是重复拍摄WebView
(使用WebViewBrush
)的快照(基于int FPS
字段),然后设置Background
属性带有此快照的名为“webViewContent
”的画布。目的是让动画显示在画布上,同时仍然可以在画布上绘制动画(如果我不做这些快速快照,画布将显示静止图像)。
它现在工作正常(我成功地将任何Tapped
事件重定向到WebView
的内部,以便点击按钮/链接/ ...被正确处理),但它有点迟缓。缓慢的位是wvb.Redraw()
我想知道如何提高我的线程的性能。它看起来像UI是期间Task.Delay
但被封锁否则...
任何输入/建议是非常欢迎!
编辑: 这里是我超时了Redraw
电话(我认为这是什么原因造成的问题,因为去掉它的应用非常敏感):
while (true)
{
webViewContent.Background = wvb;
await Task.Delay(1000/FPS);
sw.Reset();
sw.Start();
wvb.Redraw();
sw.Stop();
System.Diagnostics.Debug.WriteLine(sw.Elapsed.TotalMilliseconds);
}
这给了我这些结果在输出窗口:
0,094
0,058
0,041
0,053
0,057
0,038
0,032
0,033
0,032
0,038
0,035
0,03
0,042
0,028
0,044
0,031
0,033
0,029
0,034
0,03
0,052
0,029
所以没有那么多毕竟...
您的'Redraw'方法运行多长时间?另外,有60 FPS真的是必要的吗?你可以降低它一点,而不显示太生涩? – Servy
我今天试过使用'StopWatch' ealier,我相信'(double)Elapsed.TotalMilliseconds'属性返回了0,1XXX和0,3XXX之间的值。 – Max
如果花费了三分之一毫秒,那么即使每秒完成60次,我也看不到它会如何阻挡用户界面足够长的时间才能被某个人察觉。 UI仍然有足够的时间让消息循环保持响应。也许你没有在与你实际使用它相同的条件下正确计时。 – Servy