这是我第一次在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();
}我使用上面的函数来创建新的线程,每个线程都是在一个循环中创建的。
{StartThread(站点,i);i++;//计数器}
因为我是初学者,所以我有几个问题。
rocess.GetCurrentProcess().Threads.Count;发布于 2013-04-06 12:26:14
1)您的解决方案是可以的。线程类已经被任务类部分取代,如果您正在编写新代码,可以使用它。在.NET 4.5中也有一个全新的东西,叫做等待 .However,参见4)。
2)如果网站死了,你的ping方法可能就会崩溃。你可以给我们看那个方法的代码。
4)线程类很好,因为您可以根据需要使用ThreadState属性轻松地检查线程状态--只需创建一个List<Thread>,将线程放入其中,然后逐个启动它们。
3)如果希望从输入加载线程数量并均匀分配工作,则将任务放入队列(可以使用已经建议的ConcurrentQueue ),并让线程从队列中加载URL。样本代码:
你初始化所有东西
void initialize(){
ConcurrentQueue<string> queue = new ConcurrentQueue<string>();
foreach(string url in websites)
{
queue.Enqueue(url);
}
//and the threads
List<Thread> threads = new List<Thread>();
for (int i = 0; i < threadCountFromTheUser; i++)
{
threads.Add(new Thread(work));
}}
//work method
void work()
{
while (!queue.IsEmpty)
{
string url;
bool fetchedUrl = queue.TryDequeue(out url);
if (fetchedUrl)
ping(url);
}
}然后跑
foreach (Thread t in threads)
{
t.Start();
}代码未测试
发布于 2013-04-06 12:08:27
为每个请求建立一个新线程是效率低下的.您可能希望有固定数量的工作线程(这样就可以在cpu的每个核心上运行)。
请看一下ConcurrentQueue<T>类,它将为您提供一个线程安全的先入先出队列,您可以在其中对请求进行排队,并让每个工作线程去排队,处理它,等等,直到队列为空.
请注意,您不能从主GUI线程以外的其他线程调用GUI上的控件.查看一下ISynchronizeInvoke接口,它可以帮助您决定是否需要通过调用另一个线程来处理跨线程的情况
发布于 2013-04-06 12:14:32
你应该考虑一下.Net ThreadPool。但是,它通常不适用于执行时间超过秒的线程。
另见:并行编程模式:使用.NET框架4理解和应用并行模式
https://stackoverflow.com/questions/15850633
复制相似问题