使用Xamarin更新UI

Rye*_*Guy 3 c# multithreading xamarin.ios xamarin

我在使用Xamarin更新UI时遇到困难。目的是制作响应式UI,以便用户知道应用程序正在思考。以下是我的尝试。

尝试1

private void BeginProcess(string fileName)
{
     Device.BeginInvokeOnMainThread(() => {
         iContent.Text = "UI Successfully updated.";
     });

     Device.BeginInvokeOnMainThread(() => {
         ProccessFolder testMethod = new ProccessFolder.Initialize(fileName);
     });
}
Run Code Online (Sandbox Code Playgroud)

尝试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);
     });
}
Run Code Online (Sandbox Code Playgroud)

尝试3

private void BeginProcess(string fileName)
{
     Device.BeginInvokeOnMainThread(() => {
         iContent.Text = "UI Successfully updated.";
     });

     Task.Delay(5000);

     Device.BeginInvokeOnMainThread(() => {
         ProccessFolder testMethod = new ProccessFolder.Initialize(fileName);
     });
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这些都不起作用。如果我将ProcessFolder方法放置在后台线程中,并在主线程上调用UI更改,那将起作用。但是,ProcessFolder方法的完成时间较慢。

关于如何在仍在主线程上执行ProcessFolder的同时如何更新UI的任何建议?

Dig*_*1nt 6

有时,当您尝试从一种方法中更新主ui上的某些内容时,具体取决于您编写(和/或构造)的方式,这可能意味着主调度程序在更新主ui之前等待该方法完成。

如果您尝试下面的示例,则它将在每次foreach迭代后成功完成UI更新,因为完成它的初始任务时,它想退出for循环并点击我们的主线程调用,该主线程必须在循环之前完成再次迭代。

private void BeginProcess()
{
    Task.Run(()=>{
        for (int i = 0; i < 100; i++)
        {
            // Perform a task

            BeginInvokeOnMainThread(() => {
                iContent.Text = "UI Successfully updated: " + i " times out of 100";
            });
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

您有时可以使用以下方法来复制这种效果:

NSRunLoop.Current.RunUntil(1000);
Run Code Online (Sandbox Code Playgroud)

在调用“ BeginInvokeOnMainThread”委托时允许UI赶上。