谁有多线程代码!!我想实现10个线程同时执行一个方法!

jiebao521 2011-09-07 06:25:35

我想10个线程同时执行一个方法, 但是每个方法传入的参数是不一样的! 我在网上找了些代码,但是不行,造成线程混乱,谁能教教我啊! !

想要实现的是: 10个线程同时去登陆网站,然后采集东西。 当然我也有10个用户名。 10个线程 每个线程对应一个用户。

...全文
205 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
happytonice 2012-06-16
  • 打赏
  • 举报
回复
好东西不少
MrGaoGao 2012-06-16
  • 打赏
  • 举报
回复
我现在也遇到和楼主相似的问题,请问楼主解决与否?!请指教~~~~~
半兽人写程序 2011-09-07
  • 打赏
  • 举报
回复

public abstract class BaseProcessor
{
public BaseProcessor()
{
m_SyncEvents = new SyncEvents();
m_Thread = null;
m_ExitTimeOut = 500;
m_WorkTimeOut = System.Threading.Timeout.Infinite;
m_IsPause = false;
m_IsStoping = false;
m_ThreadName = "";
}

public BaseProcessor(int exitTimeOut , int workTimeOut)
{
m_SyncEvents = new SyncEvents();
m_Thread = null;
m_ExitTimeOut = exitTimeOut;
m_WorkTimeOut = workTimeOut;
}

public BaseProcessor(int exitTimeOut)
{
m_SyncEvents = new SyncEvents();
m_Thread = null;
m_ExitTimeOut = exitTimeOut;
m_WorkTimeOut = System.Threading.Timeout.Infinite;
}

public bool IsPause
{
get { return this.m_IsPause; }
}

public bool IsStoping
{
get { return this.m_IsStoping; }
}

public virtual void Start()
{

this.m_ExitObject = new ExitObject();
this.m_ExitObject.Reset();
this.m_ExitObject.name = this.ThreadName;
m_IsPause = false;
m_IsStoping = false;
if (m_Thread == null || !m_Thread.IsAlive)
{
m_Thread = new Thread(new ThreadStart(this.DoWork));
if (this.ThreadName != string.Empty)
{
m_Thread.Name = this.ThreadName;
}

this.SyncEventsHandle.ExitWaitHandle.Reset();
m_Thread.Start();
}
m_SyncEvents.WorkWaitHandle.Set();

}

public virtual void DoNextStep()
{
m_SyncEvents.WorkWaitHandle.Set();
}

public virtual void Stop()
{
m_IsStoping = true;
if (m_Thread == null)
return;
try
{
this.BeforeStoping();
this.SyncEventsHandle.ExitWaitHandle.Set();
if (!m_Thread.Join(500))
{
m_Thread.Abort();
}
}
catch (System.Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message.ToString());
}

this.m_Thread = null;
}

public virtual void Pause()
{
m_IsPause = true;
}

public SyncEvents SyncEventsHandle
{
get { return m_SyncEvents; }
}

public int ExitTimeout
{
get { return m_ExitTimeout; }
set{ m_ExitTimeout = value; }

}

public int WorkTimeout
{
get { return m_WorkTimeout; }
set { m_WorkTimeout = value; }
}

public string ThreadName
{
get { return this.m_ThreadName; }
set { m_ThreadName = value; }
}


public class SyncEvents
{

public enum EventType : int
{
Exist = 0,
Work = 1,
}

public SyncEvents()
{
m_ExitEvent = new EventWaitHandle(false, EventResetMode.ManualReset);
m_WorkEvent = new EventWaitHandle(false, EventResetMode.AutoReset);
m_EventArray = new EventWaitHandle[2];
m_EventArray[0] = m_ExitEvent;
m_EventArray[1] = m_WorkEvent;
}

public EventWaitHandle ExitWaitHandle
{
get { return m_ExitEvent; }
}

public EventWaitHandle WorkWaitHandle
{
get { return m_WorkEvent; }
}

public EventWaitHandle[] EventHandleArray
{
get { return m_EventArray; }
}

private EventWaitHandle m_ExitEvent;
private EventWaitHandle m_WorkEvent;
private EventWaitHandle [] m_EventArray;
};

private void DoWork()
{
this.BeforeStart();
int WaitResult;
WaitResult = EventWaitHandle.WaitAny(this.SyncEventsHandle.EventHandleArray, m_WorkTimeOut, true);
while (
(WaitResult == (int)SyncEvents.EventType.Work)
||
(WaitResult == EventWaitHandle.WaitTimeout)
)
{
if (!m_IsPause)
{
if (!DoProcessor())
{
this.m_ExitObject.reason = PublicDefineDll.Enums.EExitReason.Finished;
break;
}
}
WaitResult = EventWaitHandle.WaitAny(this.SyncEventsHandle.EventHandleArray, m_WorkTimeOut, true);
}
if (WaitResult == (int)SyncEvents.EventType.Exist)
{
this.m_ExitObject.reason = PublicDefineDll.Enums.EExitReason.UserAbort;
}
this.BeforeExit(this.m_ExitObject);

}

protected abstract bool DoProcessor();

protected virtual void BeforeExit(ExitObject eo)
{
System.Diagnostics.Debug.WriteLine(eo.ToString());
}

protected virtual void BeforeStart()
{
System.Diagnostics.Debug.WriteLine("Thread Start:" + this.ThreadName);
}

/// <summary>
/// 在线程退出信号量有效之前的处理操作,不受退出时限限制
/// 如果退出出时要做很长的耗时操作,重载这个函数实现
/// 但由于这个函数很可能是主线程调用,因此要考虑同步和阻塞问题
/// </summary>
protected virtual void BeforeStoping()
{
System.Diagnostics.Debug.WriteLine("Thread stoping:" + this.ThreadName);
}

protected SyncEvents m_SyncEvents;
protected Thread m_Thread;
protected int m_ExitTimeout;
protected int m_WorkTimeout;
protected bool m_IsPause;
protected string m_ThreadName;
protected ExitObject m_ExitObject;
protected bool m_IsStoping;

public class ExitObject
{
public ExitObject()
{
this.Reset();
}
public void Reset()
{
this.exitCode = -1;
this.reason = PublicDefineDll.Enums.EExitReason.Invalid;
this.description = string.Empty;
this.name = string.Empty;
}

public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.Append("ThreadName: ");
sb.Append(this.name);
sb.Append("Reason: ");
sb.Append(this.reason.ToString());
sb.Append("Description: ");
sb.Append(this.description);
sb.Append("ExitCode: ");
sb.Append(this.exitCode.ToString());
return sb.ToString();
}
public string name;
public int exitCode;
public PublicDefineDll.Enums.EExitReason reason;
public string description;
}
}

老夫心好啊。贴的是可以重用的线程类。内部用内核对象实现。可以实现2种模式
1 事件驱动模式:每次调用DoNextStep执行一次.把workTimeOut设置到最大就可以
2 循环模式:每过一定时间,循环执行。
3 用户自己实现 DoProcessor()接口,完成工作。return true 继续 return false 退出

CMyThread : public CBaseProcessor
{
public CMyThread():: base(200, 500){ //200线程退出最大等待时间;//500线程每次执行等待时间
}
protected override bool DoProcessor(){
返回true继续转。
返回false退出。
}
}
sanjiawan 2011-09-07
  • 打赏
  • 举报
回复
给你个多线程的例子
private void btnDataUp_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(GetDataUp); //创建一个线程 其中GetDataUp是该线程要执行的方法
thread.Start(); //该线程运行 无论上述线程是否执行完毕都继续执行一下代码
lblUpdateMessage.Visibility = Visibility.Visible;
}


private void GetDataUp()
{
//执行的代码
Action action; //封装一个方法 该方法不具备参数并且不返回值 action = () =>
{
//执行的代码
};
btnDataUp.Dispatcher.BeginInvoke(DispatcherPriority.SystemIdle, action); //关联的线程上异步执行委托 执行Action方法

}
Icedmilk 2011-09-07
  • 打赏
  • 举报
回复
ThreadPool.QueueUserWorkItem();
半兽人写程序 2011-09-07
  • 打赏
  • 举报
回复
分太少了。不然老夫贴出来
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧