我在使用Xamarin更新UI时遇到困难。我们的目标是使用户界面React,使用户知道应用程序正在思考。下面是我的尝试。
尝试1
private void BeginProcess(string fileName)
{
Device.BeginInvokeOnMainThread(() => {
iContent.Text = "UI Successfully updated.";
});
Device.BeginInvokeOnMainThread(() => {
ProccessFolder testMethod = new ProccessFolder.Initialize(fileName);
});
}
字符串
尝试2
private void UpdateUI () {
iContent.Text = "UI Successfully updated.";
}
private void BeginProcess(string fileName)
{
System.Threading.Thread t = new System.Threading.Thread(UpdateUI);
t.Priority = System.Threading.ThreadPriority.Highest;
t.IsBackground = false;
t.Start();
Device.BeginInvokeOnMainThread(() => {
ProccessFolder testMethod = new ProccessFolder.Initialize(fileName);
});
}
型
尝试3
private void BeginProcess(string fileName)
{
Device.BeginInvokeOnMainThread(() => {
iContent.Text = "UI Successfully updated.";
});
Task.Delay(5000);
Device.BeginInvokeOnMainThread(() => {
ProccessFolder testMethod = new ProccessFolder.Initialize(fileName);
});
}
型
不幸的是,这些都不起作用。如果我将ProcessFolder方法放在后台线程中,并在主线程上调用UI更改,则可以正常工作。但是ProcessFolder方法的完成时间比较慢。
有什么建议可以让我在更新UI的同时仍然在主线程上执行ProcessFolder?
3条答案
按热度按时间q7solyqu1#
有时候,当你试图从一个方法中更新主ui上的某些内容时,根据你编写(和/或结构化)的方式,这可能意味着主调度程序在更新主ui之前会等待方法完成。
如果你要尝试下面的例子,它会在每次foreach迭代后成功完成UI更新,因为当它完成它的初始任务时,它希望从for循环中返回并命中我们的主线程调用,这必须在循环可以再次迭代之前完成。
字符串
有时可以通过使用以下命令复制这种效果:
型
以允许UI在调用“BeginInvokeOnMainThread”委托时跟上。
vybvopom2#
首先,所有的UI更新都必须在主线程中完成。
对于您的特定问题,您可以使用async/await(https://msdn.microsoft.com/library/hh191443(vs.110).aspx)
你可以在主线程中这样做:
字符串
您必须使Initialize方法异步并返回一个任务
kuuvgm7e3#
为什么不用途:
字符串
干净利落