Thread中带参方法无法使用之解决方案


using System;
using System.Collections.Generic;
using System.Collections;
using System.Threading;
namespace ThreadHelperLib
{
    public class ThreadHelper
    {
        public ThreadHelper()
        {

        }
        ~ThreadHelper() { }

        #region 私有变量
        /// <summary>
        /// 当前线程       
        /// </summary>
        private Thread thrWork = null;
        /// <summary>
        /// 参数集合
        /// </summary>
        private List<object> objParams = new List<object>();
        /// <summary>
        /// 方法
        /// </summary>
        private Delegate Method = null ;

        /// <summary>
        /// 线程结束标识
        /// </summary>
        private bool overFlag = false;

        private string Error = string.Empty;

        #endregion

        #region 公共方法

        /// <summary>
        /// 设置参数
        /// </summary>
        /// <param name="o"></param>
        public void SetParams(object o)
        {
            objParams.Add(o);
        }
        /// <summary>
        /// 设置方法
        /// </summary>
        /// <param name="pMethod"></param>
        public void SetMethod(Delegate pMethod)
        {
            Method = pMethod;
        }
        public bool StartThread()
        {
            try
            {
                ThreadStart myThreadStart = new ThreadStart(this.ThreadProc);
                thrWork = new Thread(myThreadStart);
                thrWork.Start();
                return true;
            }
            catch (ThreadStartException e)
            {
                Error = e.ToString();
                thrWork.Abort();
                return false;
            }
        }
        public void EndStart()
        {
            if (this.overFlag)
            {
                this.thrWork.Abort();
            }
        }
        /// <summary>
        /// 错误消息
        /// </summary>
        /// <returns></returns>
        public  string outError()
        {
            return this.Error;
        }
        #endregion

        #region 私有方法

      
        private void ThreadProc()
        {
            try
            {
                System.Collections.IEnumerator m_Enum = objParams.GetEnumerator();
                while (m_Enum.MoveNext())
                {
                    Method.DynamicInvoke(m_Enum.Current);
                }
            }
            catch (ThreadStateException err)
            {
                this.Error = err.ToString();
            }
            finally
            {
                this.overFlag = true;
            }
        }
        #endregion
    }

}



using System;
using System.Collections.Generic;
using System.Text;

using ThreadHelperLib;
namespace helloWorld
{
  
    class Program
    {
       private delegate void TestCall(string str);
        static void Main()
        {
           string state = "123";
           for (int i = 0; i < 3000; i++)
           {
               ThreadHelper thr = new ThreadHelper();
               thr.SetMethod(new TestCall(test));
               thr.SetParams(i.ToString());
               thr.StartThread();
               thr.EndStart();
           }
         

        
            Console.ReadLine();
           
        }
        private static void test(string state)
        {
            Console.WriteLine(state);
        }
      

        static void c_OnTestHandler()
        {
            Console.WriteLine("sadfasdfsadf");
        }
      
    }
}

posted @   Leepy  阅读(591)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
点击右上角即可分享
微信分享提示