c# 多线程通信问题,高手请进哦!!
最近一直在研究多线程通信这方面的问题,正在学习中,遇到了一些问题,请各位高手赐教……
问题如下:
想实现客户端和服务器通信,
一个客户端向许多不同的服务器请求,
其中,客户端向服务器请求用的是多线程
我不会的部分是:
1. 要求客户端向服务器请求超过10秒后自动结束本线程
2. 如何判断客户端的所有线程都结束了?(我想做的是等所有线程都结束了,再继续执行主程序中下面的代码)
刚刚接触c# 多线程和通信这方面的内容,望各位前辈多多指教,小女子在此谢过了!
[最优解释]
小女子?没图没真相阿。。。好吧我就爱帮助小姑娘
线程超时设置一般最好控制在17毫秒以上,因为一个cpu时钟是16毫秒,一个线程一个类,只是部分代码,大概思路在里面了
internal delegate void ThreadOverDelegate(string threadClassID);
/// <summary>
/// 线程执行类
/// </summary>
internal class ThreadClass<T> where T:IMsg
{
//识别ID
string threadClassID = string.Empty;
//处理消息事件
private event MessageQueue<T>.MsgDealDelegate MsgDealEvent;
private event ThreadOverDelegate ThreadOverEvent;
//超时计数器
private readonly System.Timers.Timer timer = new System.Timers.Timer();
//线程同步
private readonly AutoResetEvent thread_startEvent = new AutoResetEvent(false);
//线程锁
private readonly object thread_msgLock = new object();
//超时标记
public bool isTimeout = false;
//执行任务线程
Thread thread;
//消息数据
T Msg;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="_MsgDealEvent">处理消息事件</param>
internal ThreadClass(string _threadClassID, MessageQueue<T>.MsgDealDelegate _MsgDealEvent, ThreadOverDelegate _ThreadOverEvent)
{
threadClassID = _threadClassID;
MsgDealEvent = _MsgDealEvent;
ThreadOverEvent = _ThreadOverEvent;
}
/// <summary>
/// 加入任务
/// </summary>
/// <param name="msg"></param>
internal void AddTask(T msg)
{
Msg = msg;
if (Msg.MsgTimeOut > 0)
{
timer.Interval = Msg.MsgTimeOut;
timer.Elapsed += Elapsed;
}
thread_startEvent.Reset();
thread = new Thread(BeginTask) { IsBackground = true };
thread.Start();
thread_startEvent.WaitOne();
}
/// <summary>
/// 结束任务
/// </summary>
internal void StopTask()
{
lock (thread_msgLock)
{
if (thread != null)
thread.Abort();
}
}
//执行任务
private void BeginTask()
{
if (Msg.MsgTimeOut > 0)
{
timer.Start();
}
thread_startEvent.Set();
//处理消息
MsgDealEvent(Msg);
lock (thread_msgLock)
{
if (!isTimeout)
{
timer.Stop();
//线程处理结束回调事件
ThreadOverEvent(threadClassID);
}
}
}
//计数器处理
private void Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
lock (thread_msgLock)
{
isTimeout = true;
timer.Enabled = false;
//终止线程
thread.Abort();
//线程处理结束回调事件
ThreadOverEvent(threadClassID);
}
//消息超时通知
Msg.TimeOutMessage();
}
}
class TimeOutSocket
{
private static bool IsConnectionSuccessful = false;
private static Exception socketexception;
private static ManualResetEvent TimeoutObject = new ManualResetEvent(false);
public static Socket Connect(IPAddress ipAddress, int port, int timeoutMSec)
{
TimeoutObject.Reset();
socketexception = null;
Socket temp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
temp.BeginConnect(new IPEndPoint(ipAddress, port), new AsyncCallback(CallBackMethod), temp);
if (TimeoutObject.WaitOne(timeoutMSec, false))
{
if (IsConnectionSuccessful)
{
return temp;
}
else
{
//throw new TimeoutException("连接远程主机失败!请检查网络连接是否通畅。");
throw socketexception;
}
}
else
{
temp.Close();
throw new TimeoutException("连接超时!请检查网络连接是否通畅。");
}
}
private static void CallBackMethod(IAsyncResult asyncresult)
{
try
{
IsConnectionSuccessful = false;
Socket client = asyncresult.AsyncState as Socket;
client.EndConnect(asyncresult);
IsConnectionSuccessful = true;
}
catch (Exception ex)
{
IsConnectionSuccessful = false;
socketexception = ex;
}
finally
{
TimeoutObject.Set();
}
}
}
try
{
sock = TimeoutSocket.Connect(ip,port,10000);
label1.Text = "连接成功";
}
catch{
label1.Text = "连接失败";
}