IProgress <t> .Report在第二个for循环中工作,但不在第一个循环中工作

时间:2017-05-08 12:13:28

标签: c# multithreading

我正在制作一款需要漫长的世界生成方法的游戏,因此我正在努力添加一个加载画面。
在我的生成方法中,有4个for循环(2和4嵌套在1和3中) 我正在使用Task.Run在一个线程上运行我的代,并使用IProgress.Report()来报告我的进度。
这在第二组循环中完美地起作用,但在第一组循环中不起作用 这是我第一次进入线程,所以我不知道从哪里开始调试问题,因此我在这里问 相关代码包括在下面。

头等舱:

var progressHandler = new Progress<int>(value =>
{
    prog.Value = value; //prog is a progress bar
});
var progress = (IProgress<int>) progressHandler;

_result = Task.Run(() =>
{
    var world = WorldTools.GenerateWorld(0, 500, 500, tileSet, "World", 24, tilesPath, progress);
    return world;
 });

第二类(WorldTools.GenerateWorld()):

try
{
    //Do some stuff
    for (var i = point; i < (gridX + point); i++)
    {
        for (var j = point; j < (gridY + point); j++)
        {
            //Copy value from [i,j] to another array
            z++;
            progress.Report(z);
        }
    }
}
catch (Exception e)
{
    //Catch the exception.
}

for (var i = 0; i < world.Grid.GetLength(0); i++)
{
    for (var j = 0; j < world.Grid.GetLength(1); j++)
    {
        //Several conditionals, create an object based on value
        z++;
        progress.Report(z);
    }
}

编辑的代码是非常基本的东西,只是一些条件或数组操作。第一个for循环几乎立即执行,而第二个for循环执行大约15秒。我只是为了冗长而编辑,如果需要完整的来源,我会提出它 同样,问题是progress.Report(z)似乎没有在第一组循环中触发,但它在第二组中按预期工作。我知道第一组循环按照我的预期运行,因为当我们到达第二组循环时,Z值会迭代并且达到预期值。
提前致谢。

0 个答案:

没有答案