主线程和工作线程分离

时间:2021-01-18 13:45:01

标签: c# multithreading task threadpool

我觉得有点迷茫,找到了一个很好的方法来获得一些关于如何解决我的线程问题 C# Unity 的想法。我试图实现的是从长时间运行的任务中卸载我的主线程。这样可以避免主线程等待一个或多个任务完成后主线程才能正常继续。

现在我有这个测试代码。

    public void Start()
    {
        var workers = new List<DataChunk>();

        workers.Add(new DataChunk());
        workers.Add(new DataChunk());
        foreach (var worker in workers)
        {
            Task.Run(() => worker);
        }
    }

DataChunck 只是在此测试中被剥离,并且可能包含假定作为完整任务包含的所有过程。所以现在我只有一个计时器来模拟正在做的事情并花时间。

    public class DataChunk
    {
        public bool isDone = false;
        public DataChunk()
        {           
           System.Random r = new System.Random();
           int rInt = r.Next(1000, 2000); 
           Thread.Sleep(rInt);
           allDataLoaded = true;
           Debug.Log("Done " + rInt);
           isDone = true;
        }
    }

这最终并没有真​​正达到我想要的效果,因为它只执行这些DataChunks作为任务连续执行,从不放弃主线程。

我认为缺少的是使这个异步,因此它们可以从主线程启动,然后最好不必等待主线程完成。因为这应该尽可能从队列中检查。

如果我想将它可视化,应该可以像这样工作。 enter image description here

有人想分享实现此类基于线程或基于任务的行为所缺少的东西吗?

1 个答案:

答案 0 :(得分:2)

您正在 DataChunk 构造函数中调用 Thread.Sleep:workers.Add(new DataChunk()),因此您的 Thread.Sleep 步骤不是并行执行的。

最好将 DataChunk 构造函数之外的 Thread.Sleep 逻辑移到某个 DataChunk 类方法中,并从 Task.Run(() => worker.SomeMethodWithThreadSleep());

相关问题