相关疑难解决方法(0)

何时在C#中使用线程池?

我一直在尝试用C#学习多线程编程,我很困惑什么时候最好使用线程池而不是创建我自己的线程.一本书建议仅为小任务使用线程池(无论这意味着什么),但我似乎无法找到任何真正的指导方针.在做出此编程决策时,您使用了哪些注意事项?

c# multithreading threadpool

126
推荐指数
6
解决办法
7万
查看次数

C#线程池限制线程

好吧......我给了网站一个公平的搜索,并阅读了很多关于这个主题的帖子.我发现了这个问题:C#中一个简单线程池的代码特别有用.

但是,总是看起来,我需要的东西略有不同.

我查看了MSDN示例,并根据我的需要进行了调整.我引用的示例如下:http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80,printer).aspx

我的问题是这个.我有一组相当简单的代码,它通过HttpWebRequestWebResponse类加载一个网页,并通过一个来读取结果Stream.我在一个线程中触发此方法,因为它需要执行多次.该方法本身很短,但需要触发的次数(每次都有不同的数据)会有所不同.它可以是1到200之间的任何地方.

我读过的所有内容似乎都表明ThreadPool班级是主要候选人.这就是事情变得棘手的事情.我可能需要发出100次这样的事情,但我最多只能运行3个线程(对于这个特定的任务).

我已经尝试设置MaxThreadsThreadPool通过:

ThreadPool.SetMaxThreads(3, 3);
Run Code Online (Sandbox Code Playgroud)

我并不完全相信这种方法有效.此外,我不想破坏将在其上运行的系统上运行的其他网站或程序.因此,通过限制线程的#ThreadPool,我可以确定这仅适用于我的代码和我的线程吗?

MSDN示例使用事件驱动方法和调用WaitHandle.WaitAll(doneEvents);,这就是我这样做的方式.

所以我的问题的核心是,如何确保或指定可以为其代码运行的最大线程数,但让代码继续运行更多线程,因为之前的线程完成直到任意点?我是以正确的方式解决这个问题吗?

此致

贾森


好的,我添加了一个信号量方法并完全删除了ThreadPool代码.看起来很简单.我从http://www.albahari.com/threading/part2.aspx获取了我的信息

这个例子向我展示了如何:

[此处的文字是网站的复制/粘贴]

Semaphore容量为1的A 类似于a Mutexlock,除了Semaphore没有"所有者" - 它与线程无关.任何线程都可以调用Releasea Semaphore,而使用Mutexlock,只有获得资源的线程才能释放它.

在下面的示例中,十个线程执行一个循环,Sleep中间有一个语句.A Semaphore确保一次不超过三个线程可以执行该Sleep语句:

class SemaphoreTest
{
    static Semaphore s = new Semaphore(3, 3);  // Available=3; Capacity=3 …
Run Code Online (Sandbox Code Playgroud)

c# multithreading threadpool c#-2.0

36
推荐指数
1
解决办法
5万
查看次数

如何为Unity3D编写线程安全的C#代码?

我想了解如何编写线程安全代码.

例如,我在我的游戏中有这个代码:

bool _done = false;
Thread _thread;

// main game update loop
Update()
{
    // if computation done handle it then start again
    if(_done)
    {
        // .. handle it ...
        _done = false;
        _thread = new Thread(Work);
        _thread.Start();
    }
}

void Work()
{
     // ... massive computation

     _done = true;
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,可能会发生主游戏线程和我_thread可以拥有自己的缓存版本_done,并且一个线程可能永远不会_done在另一个线程中看到更改?

如果可能,如何解决?

  1. 是否可以解决,只应用volatile关键字.

  2. 或者是有可能读取和写入,通过价值Interlocked的类似的方法ExchangeRead

  3. 如果我包围_done读写操作lock (_someObject),需要我使用Interlocked什么东西来防止缓存?

编辑1

  1. 如果我定义 …

c# multithreading unity-game-engine

23
推荐指数
4
解决办法
6904
查看次数

如何确定子线程是否已完成

我在我的应用程序中使用while(true)循环使用多个线程,现在我想在所有活动线程完成其工作时退出循环.

.net c# multithreading

5
推荐指数
2
解决办法
1万
查看次数

创建线程时出现NullReferenceException

我在创建一个简单的线程池时正在看这个线程。在那里,我遇到了@MilanGardian对.NET 3.5的响应,响应非常优雅并且可以实现我的目的:

using System;
using System.Collections.Generic;
using System.Threading;

namespace SimpleThreadPool
{
    public sealed class Pool : IDisposable
    {
        public Pool(int size)
        {
            this._workers = new LinkedList<Thread>();
            for (var i = 0; i < size; ++i)
            {
                var worker = new Thread(this.Worker) { Name = string.Concat("Worker ", i) };
                worker.Start();
                this._workers.AddLast(worker);
            }
        }

        public void Dispose()
        {
            var waitForThreads = false;
            lock (this._tasks)
            {
                if (!this._disposed)
                {
                    GC.SuppressFinalize(this);

                    this._disallowAdd = true; // wait for all …
Run Code Online (Sandbox Code Playgroud)

c# debugging multithreading nullreferenceexception

5
推荐指数
1
解决办法
3008
查看次数