这是我第一次在 C# 应用程序中使用线程。基本上它是一个应用程序,用于检查列表中的一堆网站是死是活。
这是我第一次尝试使用多线程
public void StartThread(string URL,int no)
{
Thread newThread = new Thread(() =>
{
BeginInvoke(new Action(() => richTextBox1.Text += "Thread " + no + " Running" + Environment.NewLine));
bool b = ping(URL);
if (b == true) { BeginInvoke(new Action(() => richTextBox2.Text += "Okay" + Environment.NewLine)); }
else
{ return; }
});
newThread.Start();
}
我使用上面的函数来创建新线程,并且每个线程都是在循环内创建的。
foreach(网站中的字符串网站){
StartThread(站点,i);
我++; // 柜台 }
由于我是初学者,所以我有几个问题。
- 该代码工作正常,但我不确定这是否是最好的解决方案
- 有时线程运行完美,但有时线程不会从方法返回任何值ping()它使用 WebRequest 检查主机并返回 true(如果其在线)。平常吗?
- 如果我要求用户指定他需要使用的线程数,我如何在这些线程之间平均分配工作?
- 他们是我跟踪线程状态(死/活)的优雅方式吗?我目前使用
rocess.GetCurrentProcess().Threads.Count;
为每个请求启动一个新线程效率很低……您可能希望拥有固定数量的工作线程(这样就可以在 cpu 的每个核心上运行)
看看ConcurrentQueue<T>
类,它将为您提供一个线程安全的先进先出队列,您可以在其中将请求排队,并让每个工作线程将请求出队,处理它,依此类推,直到队列为空......
请注意,您可能无法从主 GUI 线程之外的其他线程调用 GUI 上的控件...看看ISynchronizeInvoke
接口可以帮助您决定是否需要通过调用另一个线程来处理跨线程情况
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)