C# 如何中止CLR线程?
关于我创建的线程,我有一个问题。 当我启动线程时,CPU使用率会变得更高,并使服务器速度变慢。 我想中止此进程并重新运行它。 我使用ClrThread在使用名称空间的进程中查找方法。 如何在ClrThread中执行C# 如何中止CLR线程?,c#,C#,关于我创建的线程,我有一个问题。 当我启动线程时,CPU使用率会变得更高,并使服务器速度变慢。 我想中止此进程并重新运行它。 我使用ClrThread在使用名称空间的进程中查找方法。 如何在ClrThread中执行Thread.Abort() 这是我的密码 int _threadCounter = 0; Thread reminderThread = new Thread(CreateObject); string startOfThisNames
Thread.Abort()
这是我的密码
int _threadCounter = 0;
Thread reminderThread = new Thread(CreateObject);
string startOfThisNamespace = this.GetType().Namespace.ToString().Split('.')[0];
using (DataTarget target = DataTarget.AttachToProcess(System.Diagnostics.Process.GetCurrentProcess().Id, false))
{
ClrRuntime runtime = target.ClrVersions.First().CreateRuntime();
foreach(ClrThread _thread in runtime.Threads.ToList())
{
_threadCounter += 1;
IEnumerable<ClrStackFrame> _stackFrames = _thread.EnumerateStackTrace();
List<ClrStackFrame> _stackRelatedToUs = _stackFrames
.Where(o => o.Method != null && o.Method.ToString().StartsWith(startOfThisNamespace)).ToList();
if (_stackRelatedToUs.Count > 0)
{
foreach (var s in _stackRelatedToUs)
{
string _methodName = s.Method.Name;
if (_methodName == "CreateObject")
{
if (_thread.IsAlive)
{
//_thread.Abort(); Like This!!!
}
}
reminderThread.Start();
}
}
else
{
if (_threadCounter == runtime.Threads.Count())
{
if (!reminderThread.IsAlive){
reminderThread.Start();
}
}
}
}
}
int\u线程计数器=0;
线程提醒线程=新线程(CreateObject);
string startOfThisNamespace=this.GetType().Namespace.ToString().Split('.')[0];
使用(DataTarget target=DataTarget.AttachToProcess(System.Diagnostics.Process.GetCurrentProcess().Id,false))
{
ClrRuntime runtime=target.ClrVersions.First().CreateRuntime();
foreach(ClrThread\u runtime.Threads.ToList()中的线程)
{
_线程计数器+=1;
IEnumerable_stackFrames=_thread.EnumerateStackTrace();
列表_stackRelatedToUs=_stackFrames
.Where(o=>o.Method!=null&&o.Method.ToString().StartsWith(startofthenamespace)).ToList();
如果(_stackRelatedToUs.Count>0)
{
foreach(var s in_stackRelatedToUs)
{
字符串_methodName=s.Method.Name;
如果(_methodName==“CreateObject”)
{
如果(_thread.IsAlive)
{
//_thread.Abort();像这样!!!
}
}
rementerThread.Start();
}
}
其他的
{
if(_threadCounter==runtime.Threads.Count())
{
如果(!rementerThread.IsAlive){
rementerThread.Start();
}
}
}
}
}
谢谢你和问候。这里有一个小例子
using System;
using System.Threading;
namespace ConsoleApp4
{
class Program
{
static void Main(string[] args)
{
using (CancellationTokenSource source = new CancellationTokenSource())
{
CancellationToken token = source.Token;
token.Register(Notify);
new Thread(Worker).Start(token);
Console.WriteLine("Press a key to abort the thread");
Console.ReadLine();
source.Cancel();
//wait 5 seconds for the thread to abort
source.Token.WaitHandle.WaitOne(5000, true);
}
}
/// <summary>
/// callback to do stuff when thread is cancelled
/// </summary>
static void Notify()
{
Console.WriteLine("thread is cancelled");
}
/// <summary>
/// worker thread
/// </summary>
/// <param name="token"></param>
static void Worker(object token)
{
CancellationToken _token = (CancellationToken)token;
do
{
Console.WriteLine("thread is working....");
Thread.Sleep(1000); //pretend I'm doing work
} while (!_token.IsCancellationRequested);
}
}
}
使用系统;
使用系统线程;
名称空间控制台EAPP4
{
班级计划
{
静态void Main(字符串[]参数)
{
使用(CancellationTokenSource=new CancellationTokenSource())
{
CancellationToken=source.token;
令牌。注册(通知);
新线程(工作线程).Start(令牌);
Console.WriteLine(“按键中止线程”);
Console.ReadLine();
source.Cancel();
//等待5秒钟线程中止
source.Token.WaitHandle.WaitOne(5000,true);
}
}
///
///当线程被取消时执行回调操作
///
静态void Notify()
{
Console.WriteLine(“线程被取消”);
}
///
///工作线程
///
///
静态无效工作程序(对象令牌)
{
取消令牌_令牌=(取消令牌)令牌;
做
{
Console.WriteLine(“线程正在工作…”);
Thread.Sleep(1000);//假装我在工作
}while(!\u token.iscancellationrequest);
}
}
}
您如何诊断该线程上的实际问题,一个粗糙的线程中止是相当危险的,因为在大多数代码中,它是完全意外的,并且内容可能不会正确展开。您是否对尝试中止的方法有代码源代码控制?因为如果您这样做了,那么您可以修改它以获取CancellationToken,并在适当的时间向方法发出自杀信号。@RexHenderson,是的。实际上,我试图调用的方法是我正在使用的API。然后将CancellationToken传递给该方法,并让它在执行工作时监视它。至少这样,该方法可以有机会干净地关闭和恢复exit@RexHenderson,我会查一查。你能给我一些提示来使用上面的代码吗?如果可以的话。我们将不胜感激。