Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何中止CLR线程?_C# - Fatal编程技术网

C# 如何中止CLR线程?

C# 如何中止CLR线程?,c#,C#,关于我创建的线程,我有一个问题。 当我启动线程时,CPU使用率会变得更高,并使服务器速度变慢。 我想中止此进程并重新运行它。 我使用ClrThread在使用名称空间的进程中查找方法。 如何在ClrThread中执行Thread.Abort() 这是我的密码 int _threadCounter = 0; Thread reminderThread = new Thread(CreateObject); string startOfThisNames

关于我创建的线程,我有一个问题。 当我启动线程时,CPU使用率会变得更高,并使服务器速度变慢。 我想中止此进程并重新运行它。 我使用ClrThread在使用名称空间的进程中查找方法。 如何在ClrThread中执行
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,我会查一查。你能给我一些提示来使用上面的代码吗?如果可以的话。我们将不胜感激。