我正在开发一个基本的线程程序。我对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 也许我不明白,但问题似乎是他在加入和中止之前中止然后重新开始,我决不在我的程序中中止线程。
感谢大家的帮助,我将发布所需的信息或编辑此帖子以符合规格。我很抱歉,因为我是新人。
答案 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。