线程尚未启动

时间:2014-06-10 08:05:29

标签: c# wpf multithreading

我正在开发一个基本的线程程序。我对C#和WPF比较陌生。我基本上试图做的是在线程内部运行一个方法,以便在该方法运行时我可以获得输入。如果收到这样的输入,程序应该告诉线程完成它正在处理的当前对象并停止。

我的问题是,我无法获得Thread已经开始的迹象。即使我试图让线程运行无限循环,

while(true);

仍然没有迹象表明线程正在运行,我在尝试thread.join时遇到了ThreadStateException。

我试过检查

thread.IsAlive

我试过了

thread.ThreadState == ThreadState.Running

我知道上面的说法不正确但是我绝望了。

构建这样的线程

Thread t = new Thread(new ThreadStart(methodToRun));
t.Start();

我很肯定该方法正在运行,但是线程没有表明它正在运行。

在我的研究中,我发现与此错误有关的是 ThreadStateException: Thread has not been started when trying to join a thread 也许我不明白,但问题似乎是他在加入和中止之前中止然后重新开始,我决不在我的程序中中止线程。

感谢大家的帮助,我将发布所需的信息或编辑此帖子以符合规格。我很抱歉,因为我是新人。

2 个答案:

答案 0 :(得分:0)

尝试使用Task class代替Thread课程,因为它更容易,更新。您可以像这样简单地异步调用方法:

Task.Factory.StartNew(methodToRun);

此外,使用Task(来自链接页面)可以轻松取消这些CancellationToken个对象:

var tokenSource2 = new CancellationTokenSource();

CancellationToken ct = tokenSource2.Token;

var task = Task.Factory.StartNew(() =>
{

    // Were we already canceled?
    ct.ThrowIfCancellationRequested();

    bool moreToDo = true;
    while (moreToDo)
    {
        // Poll on this property if you have to do 
        // other cleanup before throwing. 
        if (ct.IsCancellationRequested)
        {
            // Clean up here, then...
            ct.ThrowIfCancellationRequested();
        }

    }
}, tokenSource2.Token); // Pass same token to StartNew.

tokenSource2.Cancel();

您可以在MSDN上的Task Cancellation页面上找到更多信息。

答案 1 :(得分:0)

您可以使用在启动线程时设置为true的简单标志来执行此操作。如果您使用的是.net 4.0或更高版本,您还可以查看使用支持取消的任务并行库。这是一个example