与应用程序并行无限运行循环的最佳方法是什么?
这是我到目前为止所尝试的:
激活循环的按钮:
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();
}
相当新的,所以任何帮助将不胜感激 提前致谢
答案 0 :(得分:1)
我不认为有无限循环的最好方法,但我会提供一些选项。想法是从你的主应用程序线程启动另一个线程,并利用循环,通常是,以管理无限循环。
如果您正在开发UI应用程序,请小心,因为它们在后台工作方面非常敏感。例如,WPF只允许访问创建它们的线程的UI元素,称为Dispatcher的线程。这意味着需要更新UI元素的每个后台线程都需要将工作委托给调度程序线程。这也是android的情况,区别在于Dispatcher线程被称为UI线程(WPF Dispatcher Thread,Android UI Thread)
<强> WPF 强>
在WPF中,DispatcherObject只能由与其关联的Dispatcher访问。例如,后台线程无法更新与UI线程上的Dispatcher关联的Button的内容。为了让后台线程访问Button的Content属性,后台线程必须将工作委托给与UI线程关联的Dispatcher。这是通过使用Invoke或BeginInvoke来完成的。 Invoke是同步的,BeginInvoke是异步的。该操作将添加到指定DispatcherPriority的Dispatcher队列中。
<强>的Android 强>
Android UI工具包不是线程安全的。因此,您不能从工作线程操纵UI - 您必须从UI线程对您的用户界面进行所有操作。因此,Android的单线程模型只有两个规则:
- 不要阻止UI线程
- 不要从UI线程外部访问Android UI工具包
醇>
我将提供几个例子作为展示案例:
//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);
}
});