异步多任务线程问题

鞘脂蛋白

我正在尝试异步执行多个(n)任务,这些任务合计为单个求和结果。目前,我有以下内容:

public class Foo
{
    public async void DoWork()
    {
        var stopwatch = Stopwatch.StartNew();
        List<Task> tasks = new List<Task>();

        var bar = new Bar();

        for (int i = 0; i < 20; i++)
        {
            var task = Task.Run(() =>
            {
                Thread.Sleep(500);

                bar.Count1++;
                bar.Count2++;
            });

            tasks.Add(task);
        }

        await Task.WhenAll(tasks.ToArray());

        Console.WriteLine("All done, Bar Count1: " + bar.Count1 + ", Count2: " + bar.Count2);
        stopwatch.Stop();
        Console.WriteLine("Time taken " + stopwatch.ElapsedMilliseconds + " ms");
    }
}

public class Bar
{
    public int Count1 { get; set; }
    public int Count2 { get; set; }
}

我希望bar.Count1bar.Count2在执行结束这里有20个值,但是,我每次运行程序时,我得到不同的值,为他们每个人(这是大部分时间<20)。我如何解决这个问题?

斯里拉姆·萨克提维(Sriram Sakthivel)

这里没有关闭问题。++运算符不是线程安全的因此,您需要锁定它。

lock(bar)
{    
    bar.Count1++;
    bar.Count2++;    
}

那应该解决问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章