我想交替运行代码,所以我可以在任何时候停止执行。这段代码安全吗?这是一种安全的方式来执行线程吗?
static class Program
{
static void Main()
{
var foo = new Foo();
//wait for interaction (this will be GUI app, so eg. btnNext_click)
foo.Continue();
//wait again etc.
foo.Continue();
foo.Continue();
foo.Continue();
foo.Continue();
foo.Continue();
}
}
class Foo
{
public Foo()
{
new Thread(Run).Start();
}
private void Run()
{
Break();
OnRun();
}
protected virtual void OnRun()
{
for (var i = 0; i < 5; i++)
{
Console.WriteLine(i);
Break();
}
//do something else and break;
}
private void Break()
{
lock (this)
{
Monitor.Pulse(this);
Monitor.Wait(this);
}
}
public void Continue()
{
lock (this)
{
Monitor.Pulse(this);
Monitor.Wait(this);
}
}
}
当然我知道,现在应用程序永远不会结束,但那不是重点。
我需要这个,因为我想介绍某种算法的步骤,并描述在特定时刻发生了什么,并且在一个线程中做出所有事情会导致很多并发症,即使使用少量循环代码。例如那些行:
for (var i = 0; i < 5; i++)
{
Console.WriteLine(i);
Break();
}
应该与再换成:
if (this.i < 5)
{
Console.WriteLine(i++);
}
这是我想提出什么只是一个小例子。代码将比虚拟for
循环更复杂。
这很奇怪。只是不要使用线程。 – 2010-06-28 21:06:02
@Hans Passant:你会怎么做这种......自我解释(?)代码?在'OnRun'内部,我想运行图形相关的算法,并显示用户在这一时刻发生的情况的解释。消息和顶点/边缘着色。将这样的东西拆分成小块将会很难编码。 – prostynick 2010-06-28 21:19:36
您提到问题的方式使您看起来好像不熟悉Windows窗体的UI线程模型。你应该解释什么是不能做的事情,需要与一些单独的后台线程“交替”。 – David 2010-06-28 21:20:31