首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#线程问题&最佳实践

C#线程问题&最佳实践
EN

Stack Overflow用户
提问于 2013-04-06 11:56:36
回答 3查看 3.3K关注 0票数 4

这是我第一次在C#应用程序中使用线程。基本上,它是一个应用程序,它检查列表中的一堆网站,不管它是死的还是活的。

这是我第一次尝试使用多线程。

代码语言:javascript
运行
复制
    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++;//计数器}

因为我是初学者,所以我有几个问题。

  1. 代码运行良好,但我不确定这是否是最好的解决方案
  2. 有时线程运行良好,但有时线程不返回ping()方法中的任何值,该方法检查主机,如果其联机使用WebRequest,则返回true。这很平常吗?
  3. 如果我要求用户指定他需要使用的线程的no,我如何在这些线程之间平均分配工作?
  4. 它们是我跟踪线程状态(死/活)的一种优雅方式吗?我目前使用rocess.GetCurrentProcess().Threads.Count;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-06 12:26:14

1)您的解决方案是可以的。线程类已经被任务类部分取代,如果您正在编写新代码,可以使用它。在.NET 4.5中也有一个全新的东西,叫做等待 .However,参见4)。

2)如果网站死了,你的ping方法可能就会崩溃。你可以给我们看那个方法的代码。

4)线程类很好,因为您可以根据需要使用ThreadState属性轻松地检查线程状态--只需创建一个List<Thread>,将线程放入其中,然后逐个启动它们。

3)如果希望从输入加载线程数量并均匀分配工作,则将任务放入队列(可以使用已经建议的ConcurrentQueue ),并让线程从队列中加载URL。样本代码:

你初始化所有东西

代码语言:javascript
运行
复制
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);
    }
}

然后跑

代码语言:javascript
运行
复制
foreach (Thread t in threads)
{
    t.Start();
}

代码未测试

票数 1
EN

Stack Overflow用户

发布于 2013-04-06 12:08:27

为每个请求建立一个新线程是效率低下的.您可能希望有固定数量的工作线程(这样就可以在cpu的每个核心上运行)。

请看一下ConcurrentQueue<T>类,它将为您提供一个线程安全的先入先出队列,您可以在其中对请求进行排队,并让每个工作线程去排队,处理它,等等,直到队列为空.

请注意,您不能从主GUI线程以外的其他线程调用GUI上的控件.查看一下ISynchronizeInvoke接口,它可以帮助您决定是否需要通过调用另一个线程来处理跨线程的情况

票数 2
EN

Stack Overflow用户

发布于 2013-04-06 12:14:32

你应该考虑一下.Net ThreadPool。但是,它通常不适用于执行时间超过秒的线程。

另见:并行编程模式:使用.NET框架4理解和应用并行模式

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15850633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档