C#多线程编程——如何启动和停止线程

29

有人能为我提供线程方面的头绪吗?我认为我知道如何做一些事情,但我需要知道如何做以下几点:

设置一个主线程,直到我发出停止信号(如果您想知道,它将在接收到数据时终止)。然后我想启动第二个线程,它将从文本框中捕获数据,并应在我发出停止信号时退出,这是在用户按下回车键时发生的。

谢谢!


在另一个线程上使用 while 循环,直到它接收到数据。 - Cole Tobin
2
启动一个线程非常简单,但停止一个线程却异常困难,请重点关注如何停止线程。 - Hans Passant
2
你可以考虑使用BackgroundWorker。它具有线程安全的事件回调,如果您需要操作表单/控件组件,则非常方便。 - Mike Park
1
线程的目的是什么?或许有更好的选择。如果线程只是在轮询某些内容,你可能想使用 System.Windows.Forms.Timer 而不是创建新的线程。 - Dax Fohl
3个回答

24

这是我的做法...

public class ThreadA {
    public ThreadA(object[] args) {
        ...
    }
    public void Run() {
        while (true) {
            Thread.sleep(1000); // wait 1 second for something to happen.
            doStuff();
            if(conditionToExitReceived) // what im waiting for...
                break;
        }
        //perform cleanup if there is any...
    }
}

然后在它自己的线程中运行...(我这样做是因为我还想将参数发送到线程中)

private void FireThread(){
    Thread thread = new Thread(new ThreadStart(this.startThread));
    thread.start();
}
private void (startThread){
    new ThreadA(args).Run();
}

通过调用 "FireThread()" 方法创建线程。

新创建的线程将运行,直到满足其停止条件,然后终止...

可以使用委托向“主”发送信号,告诉它线程何时已经终止...这样你就可以启动第二个线程了...

最好阅读:这篇 MSDN 文章


1
请注意,这种方法可能会导致出现一秒钟的延迟,直到要做的事情显示出来并实际执行。这并不一定是坏事,取决于您的要求。我目前正在搜索如何最好地使用后台工作线程,使用EventWaitHandle进行跨进程/线程信号传递,但我有幸控制两个进程(生成器和执行器)。这应该消除任何轮询延迟。 - William T. Mallard

13
Thread th = new Thread(function1);
th.Start();
th.Abort();

void function1(){
//code here
}

23
我认为“Abort()”应该是最后的选择。最好设置一个标志,并使线程优雅地停止。 - Mike Park
14
抱歉,但是Thread.Abort几乎从来不是解决问题的方式。使用带有ManualResetEvent的循环,甚至是易失性布尔标志,将是更安全的方法。 - Douglas
“Abort” 对我来说还不错。听起来很吓人……好像会强制退出,但它只是在线程中抛出一个异常。如果线程没有捕获它,那么它就会退出。通常在代码周围有一个通用的错误处理程序。所以,需要捕获并通过返回处理该异常。 - steve
老哥们在这里:PlatformNotSupportedException 在该平台上不支持线程中止。 - Soner from The Ottoman Empire
没有终止方法是处理阻塞 IO 的线程所面临的问题。线程在 IO 操作完成之前(如果有的话)不会看到任何标志更改。 - silicontrip
Abort已被弃用,并将抛出PlatformNotSupportedException异常。 - ciao1092

5
在您的生成线程中使用静态AutoResetEvent,通过Set()方法回调到主线程。这位用户在SO上有一个相当不错的演示,详细介绍了如何使用它。 AutoResetEvent澄清

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接