C# 主线程和工作线程分离

C# 主线程和工作线程分离,c#,multithreading,task,threadpool,C#,Multithreading,Task,Threadpool,我觉得有点迷路了,找到一个好方法来获得一些关于如何解决线程问题C#Unity的想法。我试图实现的是从长时间运行的任务中卸载我的主线程。这是为了避免主线程等待一个或多个任务完成后,主线程才能像往常一样继续 现在我有了这个测试代码 public void Start() { var workers = new List<DataChunk>(); workers.Add(new DataChunk()); workers.

我觉得有点迷路了,找到一个好方法来获得一些关于如何解决线程问题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);
        }
    }
这并不是我最终想要实现的,因为它只执行这些数据块,即作为一行任务执行的数据块,从不放弃主线程

我认为缺少的是使这个asyc,因此它们可以从主线程开始,然后最好不必等待从主线程完成。因为这应该在可能的情况下从队列中进行检查

如果我想把它形象化的话,应该是这样的。


任何人想要分享实现这样的线程化或基于任务的行为所缺少的内容吗?

您正在调用Thread.Sleep in DataChunk构造函数:workers.Add(new DataChunk()),因此您的线程。睡眠步骤不会并行执行


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

请注意,在Unity中,事情的处理方式可能与基于dotnet的其他应用程序类型完全不同,我只对后者有经验。所以请记住这一点。如果您想生成一个CPU受限的任务,通常需要等待一个任务,该任务已通过Task.Run启动。如果您想一次启动两个任务并等待所有任务完成,您可以通过
wait Task.whall(Tasks)
启动它们,保留任务并等待它们完成。。。但正如我所说的,在团结中,可能还有其他的方式。我刚刚读到,我记忆中的是“协同程序”,但它们现在似乎已经过时了。不过,你可能想做一些研究。我真的不知道Unity在异步任务方面是否有一些“特殊的怪癖”。顺便说一句:你的示例
DataChunk
正在CTOR中睡觉。因此,“模拟工作”是在创建块的行中完成的,而不是在任务执行时完成的。所有对
Sleep
的调用当前都是在循环之前完成的,因此在
Task.Run()之外。表达式
()=>worker
是一个只返回worker的函数,因此它实际上什么也不做。
    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;
        }
    }