从Xamarin的按钮点击无限期地运行异步循环

时间:2018-02-18 18:49:02

标签: c# android visual-studio asynchronous xamarin

与应用程序并行无限运行循环的最佳方法是什么?

这是我到目前为止所尝试的:

激活循环的按钮:

private void ActiveDeactiveTest(object sender, EventArgs e)
{
    active = !active;            
}

循环:

bool runTest = false;
bool active = false;
public async void Test()
{
    while (runTest)
    {
       if (active)
       {
           LblOutput.Text = "before";
           await Task.Delay(1000);
           LblOutput.Text = "after";
        }
        else
        {
           LblOutput.Text = "Idle";
        }
    }
}

表单实例化:

public MainPage()
{
    InitializeComponent();
    runTest = true;
    Test();
}

相当新的,所以任何帮助将不胜感激 提前致谢

1 个答案:

答案 0 :(得分:1)

我不认为有无限循环的最好方法,但我会提供一些选项。想法是从你的主应用程序线程启动另一个线程,并利用循环,通常是,以管理无限循环。

如果您正在开发UI应用程序,请小心,因为它们在后台工作方面非常敏感。例如,WPF只允许访问创建它们的线程的UI元素,称为Dispatcher的线程。这意味着需要更新UI元素的每个后台线程都需要将工作委托给调度程序线程。这也是android的情况,区别在于Dispatcher线程被称为UI线程(WPF Dispatcher ThreadAndroid UI Thread

<强> WPF

  

在WPF中,DispatcherObject只能由与其关联的Dispatcher访问。例如,后台线程无法更新与UI线程上的Dispatcher关联的Button的内容。为了让后台线程访问Button的Content属性,后台线程必须将工作委托给与UI线程关联的Dispatcher。这是通过使用Invoke或BeginInvoke来完成的。 Invoke是同步的,Be​​ginInvoke是异步的。该操作将添加到指定DispatcherPriority的Dispatcher队列中。

<强>的Android

  

Android UI工具包不是线程安全的。因此,您不能从工作线程操纵UI - 您必须从UI线程对您的用户界面进行所有操作。因此,Android的单线程模型只有两个规则:

     
      
  1. 不要阻止UI线程
  2.   
  3. 不要从UI线程外部访问Android UI工具包
  4.   

我将提供几个例子作为展示案例:

//Option A, common one, loop doesn't need to have iteration at all
Task.Factory.StartNew(() =>
{               
    while (shouldLooping)
    {
        //do your job
    }
});

//Option B, kind of wierd, loop will have at least one iteration
Task.Factory.StartNew(() =>
{               
    do
    {
        //do your job
    } while (shouldLooping);
});

//Option C, if you are driven by producer/consumer pattern, BlockingCollection should be shared between producer and consumer
Task.Factory.StartNew(() =>
{
    foreach (var item in blockingCollection.GetConsumingEnumerable())
    {
        Console.WriteLine(item);
    }
});