C#多线程.abort().suspend().reusme()

C#多线程.abort().suspend().reusme(),c#,C#,如何中止、暂停或恢复线程 原因im在运行时出错。Abort()(对象引用未设置为对象实例。),在.Resume()和.Suspend()中出现Obselete错误 我尝试在我的Run()中使用Thread.Sleep(1000),但我意识到它不会工作,因为它不是所使用的线程实例 知道我该怎么做吗 thx 代码: class FolderStats:IFolderStats { 线程MyThread=null; 私有布尔x; 字符串根路径; List MyList=新列表(); Folder FD

如何中止、暂停或恢复线程

原因im在运行时出错。
Abort()
(对象引用未设置为对象实例。),在
.Resume()
.Suspend()
中出现Obselete错误

我尝试在我的
Run()
中使用Thread.Sleep(1000),但我意识到它不会工作,因为它不是所使用的线程实例

知道我该怎么做吗

thx

代码:

class FolderStats:IFolderStats
{
线程MyThread=null;
私有布尔x;
字符串根路径;
List MyList=新列表();
Folder FD=新文件夹();
公共void连接(字符串根路径)
{
控制台。写入线(状态。等待);
睡眠(1000);
FD.Path=rootpath;
Rootpath=Rootpath;
Console.WriteLine(状态:已连接);
睡眠(1000);
}
公开作废开始()
{
MyThread=新线程(运行);
MyThread.Start();
Console.WriteLine(“开始搜索”);
}          
公共停车场()
{
MyThread.Abort();
Console.WriteLine(“控制台中止。请按Enter键退出”);
}
公共空间暂停()
{
这个.x=假;
暂停暂停();
控制台。WriteLine(“控制台暂停”);
}
公众简历()
{
这个.x=真;
暂停暂停();
控制台。WriteLine(“控制台恢复”);
}
私有void PauseResume()
{
while(this.x==false)
{
睡眠(100);
}
}
公开募捐
{
MyThread=新线程(开始);
如果(!MyList.Contains(Rootpath))
{
添加(根路径);
var subDirs=Directory.GetDirectories(Rootpath,“*”);
var Data=Directory.GetFiles(Rootpath,“*”);
foreach(子目录中的字符串目录)
{
《睡眠》(2000年);
Rootpath=dir;
控制台写入线(dir);
Run();
}
foreach(数据中的字符串文件)
{
《睡眠》(2000年);
如果(!MyList.Contains(文件))
{
MyList.Add(文件);
Console.WriteLine(文件);
}
}
}
FD.NumberOfFiles=MyList.Count;
}

不要使用线程,而是使用任务。 您可以运行新任务:

Task.Run(()=>...);
您可以使用CancellationToken/CancellationTokenSource实现使任务可取消:

如果要暂停任务,可以尝试执行以下操作:


不要中止、暂停或恢复线程。您试图解决的特定任务是什么?调用Start()后,应在后台完成数据采集。它可以随时停止或暂停和恢复。另请查看一个线程是否有足够的信息,可以实际知道中止或暂停另一个线程是安全的,必须发生某种形式的交互,以便您可以放置其他线程间机制,以便有序地暂停/关闭。如果您没有这样的信息知识/通信那么这些方法本质上是不安全的,因此它们被标记为过时的。其他一些线程间机制,如Abort=>支持中断。Suspend/Resume=>使用例如屏障、条件或ManualResetEvent,或者…建议一个完全不同的概念并不能真正让OP了解为什么他不应该这样做使用这些精确的方法(暂停、恢复、中止)以及他可以做的事情(使用相同的“线程概念”)。因此,尽管TAP应该是正确的方法,但我不能对这个答案投赞成票。(但也不会投反对票)
Task.Run(()=>...);