首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c# 多线程通信有关问题,哦!

2012-12-18 
c# 多线程通信问题,高手请进哦!!最近一直在研究多线程通信这方面的问题,正在学习中,遇到了一些问题,请各位

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();
        }
    }



[其他解释]
添加TimeOutSocket类

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 = "连接失败";
}

[其他解释]
可以直接使用.net自带的Task类,建议你去看看
[其他解释]
这个东西很大,你还是从基础的一点点学些吧,不单单是线程,还有socket
[其他解释]
http://blog.csdn.net/zkx928/article/details/8240209
这个貌似能解决你的所有问题吧~
[其他解释]
如果问题是这样,我不太觉得你的“socket这方面基本上可以通信了”。在不使用Select轮询或者UDP协议的情况下,Socket和多线程无法分割。
[其他解释]
他写的是C++,但你需要的部分基本上和C#差不多
[其他解释]
http://blog.csdn.net/zkx928/article/details/8240209
[其他解释]

引用:

这个东西很大,你还是从基础的一点点学些吧,不单单是线程,还有socket

这一点我是知道的,socket这方面基本上可以通信了,就是线程这方面还欠缺,现在急用,网上查了查,没找到对我有用的,还请版主赐教……
[其他解释]
引用:
他写的是C++,但你需要的部分基本上和C#差不多

谢谢了,但是貌似我看不懂哦……
[其他解释]
谢谢各位高手的热心回答,感谢!
有什么很好的资料吗?能否指点一下?谢过了!
[其他解释]
好的,我先试试以上大家给的办法……
[其他解释]
引用:
谢谢各位高手的热心回答,感谢!
有什么很好的资料吗?能否指点一下?谢过了!


[其他解释]
好专业···
[其他解释]
null

热点排行