【发布时间】:2010-06-28 20:52:21
【问题描述】:
我想交替运行代码,所以我可以随时停止执行。这段代码安全吗?
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 循环更复杂。
【问题讨论】:
-
这很奇怪。只是不要使用线程。
-
@Hans Passant:你会怎么做这种......自我解释(?)代码?在
OnRun内部,我想运行与图形相关的算法并向用户展示此时发生的事情的解释,例如。带有消息和顶点/边缘着色。将这样的东西分成小块编码会很痛苦。 -
您对问题的措辞使您似乎不熟悉 Windows 窗体的 UI 线程模型。您应该解释需要与一些单独的后台线程“交替”的事件不能做什么。
-
@David,您不能暂停代码执行并等待用户按下按钮,然后在某个方法的中间恢复代码执行。
-
另外我不认为这里有另一个臃肿的框架,因为设置这种类型的代码相对简单。 看我的回答:stackoverflow.com/questions/3136039/…
标签: c# .net multithreading synchronization thread-safety