我现在想做一个功能就是查找所有服务器看那个空闲,如果都是在忙碌状态的情况下,让我这个任务等待其他线程执行完毕之后再执行,求讲解,求例子。!~
------解决思路----------------------
嗯,应该把 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);
------解决思路----------------------
sp1234是使用的信号量ManualResetEvent。他的对象mre有WaitOne()方法,使程序“停”在这个地方。在本程序的其他地方使用mre.Set()就能把“停”的那个地方继续运行,你可以看看这个。
他也可以用来同步多线程;也可以使用回调方法
------解决思路----------------------
额. 还是不太理解,因为我循环查询的是xml文件里面的状态,如果状态有就获取那个自定义控件的句柄,如果没有我就不知道怎么让他等待。- -
在一个集群中,总有一些服务器会卡死,会有故障,至少会响应很慢。
绝不能等待所有服务器返回空闲状态!
sp1234是使用的信号量ManualResetEvent。他的对象mre有WaitOne()方法,使程序“停”在这个地方。在本程序的其他地方使用mre.Set()就能把“停”的那个地方继续运行,你可以看看这个。
他也可以用来同步多线程;也可以使用回调方法
你说的这个方法大概知道,但是我就是不知道该让他在哪里等待,我是循环去寻找,找不到之后让他在哪里等待?上面那个例子。。
找不到什么?服务器吗?
------解决思路----------------------
你应该先把任务放到队列里,等找到空闲服务器之后再从队列里将任务发送给服务器
而不是来了一个任务就停下所有的工作开始找服务器
你跟服务器通信的这个时间,可能已经丢弃了100个任务了
你应该有一个线程只管接收任务,收到就放队列里
然后另外的线程负责从队列里取出任务交给服务器处理
这样你也不用等找不到服务器才开始纠结该把任务放哪
你要知道,线程和任务是两个概念,任务等待,放队列里就好,线程是不能等待的,否则后续任务就全部被丢弃了
------解决思路----------------------
CPU参数并不可靠,除非是纯计算型的任务。
应该让节点服务器自己取任务,而不是前置服务器分配任务。
------解决思路----------------------
比如某个节点服务设置预取N个任务,当任务队列中的任务低于N/2的时候主动向前置服务器获取新的任务添加到任务队列。