小编Cal*_*ans的帖子

C#任务未按预期工作.奇怪的错误

我一直在玩并行,我在理解程序中发生的事情时遇到了一些麻烦.

我正在尝试复制XNA框架的一些功能.我正在使用组件式设置,我想让我的程序更高效的Update一种方法是单独调用每个组件的方法Task.但是,我显然做了一些可怕的错误.

我在循环中用于更新调用的代码是:

public void Update(GameTime gameTime)
{
    Task[] tasks = new Task[engineComponents.Count];

    for (int i = 0; i < tasks.Length; i++)
    {
        tasks[i] = new Task(() => engineComponents[i].Update(gameTime));
        tasks[i].Start();
    }

    Task.WaitAll(tasks);
}
Run Code Online (Sandbox Code Playgroud)

这引发了一个奇怪的错误:

mscorlib.dll中发生了未处理的"System.AggregateException"类型异常

内部异常谈论索引超出范围.

如果我改变

Task[] tasks = new Task[engineComponents.Count];
Run Code Online (Sandbox Code Playgroud)

Task[] tasks = new Task[engineComponents.Count - 1];
Run Code Online (Sandbox Code Playgroud)

然后这似乎工作(或至少程序执行没有例外),但数组中没有足够的空间用于所有组件.尽管如此,所有组件都会更新,尽管tasks阵列中没有足够的空间来容纳它们.

但是,gameTime当游戏运行时,作为参数传递的对象有点疯狂.我发现很难确定这个问题,但我有两个组件,它们都只是使用一个圆圈的x位移动

x += (float)(gameTime.ElapsedGameTime.TotalSeconds * 10);
Run Code Online (Sandbox Code Playgroud)

然而,当使用时Tasks,它们的x位置很快就会彼此完全不同,而它们实际上应该是相同的.每个engineComponent.Update(gameTime)更新周期调用一次,并gameTime传递相同的对象.

当使用tasks[i].RunSynchronously();代替时tasks[i].Start();,程序完全按预期运行.

我知道以这种方式使用Tasks可能不是一个特别有效的编程实践,所以我的问题是好奇心:为什么上述代码不能像我期望的那样工作?我知道我遗漏了一些明显的东西,但我一直无法追查这个实现的具体问题.

为长期问题道歉,并感谢阅读;)

c# asynchronous task

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

切换语句性能C#

我们使用switch语句根据一系列条件对对象进行一些处理,我们期望在所有情况下调用默认情况.

我们对解决这个问题的最佳方式存在分歧.

我们中的一些人更喜欢例A:

switch (task)
{
    case A:
        ProcessA();
        goto default;
    case B:
        ProcessB();
        goto default;
    case C:
        ProcessC();
        goto default;
    default:
        Final();
}
Run Code Online (Sandbox Code Playgroud)

而其他人则建议使用类似B的例子:

switch (task)
{
    case A:
        ProcessA();
        break;
    case B:
        ProcessB();
        break;
    case C:
        ProcessC();
        break;
}

Final();
Run Code Online (Sandbox Code Playgroud)

因为Final()无论如何都会被调用.

这是个人偏好的情况,还是存在客观的性能差异.

我们应该注意哪些指导方针或问题?

这是用C#编写的API,并且会经常调用.我们渴望做对!

干杯!

c# switch-statement

4
推荐指数
1
解决办法
320
查看次数

标签 统计

c# ×2

asynchronous ×1

switch-statement ×1

task ×1