当前位置: 代码迷 >> C# >> 关于线程等待的一个有关问题
  详细解决方案

关于线程等待的一个有关问题

热度:432   发布时间:2016-05-05 05:31:25.0
关于线程等待的一个问题
我现在想做一个功能就是查找所有服务器看那个空闲,如果都是在忙碌状态的情况下,让我这个任务等待其他线程执行完毕之后再执行,求讲解,求例子。!~
------解决思路----------------------
嗯,应该把 Set 代码换个地方:
var eh = new ManualResetEvent(false);
var 最快 = string.Empty;
foreach (var url in urls)
{
    var clone = url;
    new Thread(x =>
    {
        try
        {
            new WebClient().DownloadData(clone);
            最快 = clone;
            eh.Set();
        }
        catch { }
    }).Start();
}
eh.WaitOne();

------解决思路----------------------
如果没有空闲服务器就加个

While(HaveNoFreeService){thread.wait(5000);}
Run(task);

------解决思路----------------------
引用:
Quote: 引用:

在一个集群中,总有一些服务器会卡死,会有故障,至少会响应很慢。

绝不能等待所有服务器返回空闲状态!
额. 还是不太理解,因为我循环查询的是xml文件里面的状态,如果状态有就获取那个自定义控件的句柄,如果没有我就不知道怎么让他等待。- -


 sp1234是使用的信号量ManualResetEvent。他的对象mre有WaitOne()方法,使程序“停”在这个地方。在本程序的其他地方使用mre.Set()就能把“停”的那个地方继续运行,你可以看看这个。
他也可以用来同步多线程;也可以使用回调方法
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

在一个集群中,总有一些服务器会卡死,会有故障,至少会响应很慢。

绝不能等待所有服务器返回空闲状态!
额. 还是不太理解,因为我循环查询的是xml文件里面的状态,如果状态有就获取那个自定义控件的句柄,如果没有我就不知道怎么让他等待。- -


 sp1234是使用的信号量ManualResetEvent。他的对象mre有WaitOne()方法,使程序“停”在这个地方。在本程序的其他地方使用mre.Set()就能把“停”的那个地方继续运行,你可以看看这个。
他也可以用来同步多线程;也可以使用回调方法

你说的这个方法大概知道,但是我就是不知道该让他在哪里等待,我是循环去寻找,找不到之后让他在哪里等待?上面那个例子。。

     找不到什么?服务器吗?
------解决思路----------------------
你应该先把任务放到队列里,等找到空闲服务器之后再从队列里将任务发送给服务器
而不是来了一个任务就停下所有的工作开始找服务器
你跟服务器通信的这个时间,可能已经丢弃了100个任务了

你应该有一个线程只管接收任务,收到就放队列里
然后另外的线程负责从队列里取出任务交给服务器处理

这样你也不用等找不到服务器才开始纠结该把任务放哪
你要知道,线程和任务是两个概念,任务等待,放队列里就好,线程是不能等待的,否则后续任务就全部被丢弃了
------解决思路----------------------
CPU参数并不可靠,除非是纯计算型的任务。
应该让节点服务器自己取任务,而不是前置服务器分配任务。
------解决思路----------------------
比如某个节点服务设置预取N个任务,当任务队列中的任务低于N/2的时候主动向前置服务器获取新的任务添加到任务队列。
  相关解决方案