C# 是否从任务更新int变量?

C# 是否从任务更新int变量?,c#,winforms,.net-4.0,locking,task,C#,Winforms,.net 4.0,Locking,Task,我目前有一个函数,它将根据数据量创建函数的X个任务,我想用每个线程执行多少数据来更新一个int变量,以显示progressBar 目前,我的所有UI都是通过计时器更新的,因此,我不会从线程中授权来更新UI(我认为在这种情况下会有更多的麻烦),而是使用计时器稍后拾取的计数更新变量并更新UI 我想知道的是,锁是更新变量的好方法还是有更好的方法 如果该变量被频繁使用,计时器是否能够读取该变量?或者,即使在更新该变量时存在旧值,计时器是否仍能够读取该变量 下面是一个大致的例子: private stat

我目前有一个函数,它将根据数据量创建函数的X个任务,我想用每个线程执行多少数据来更新一个int变量,以显示progressBar

目前,我的所有UI都是通过计时器更新的,因此,我不会从线程中授权来更新UI(我认为在这种情况下会有更多的麻烦),而是使用计时器稍后拾取的计数更新变量并更新UI

我想知道的是,锁是更新变量的好方法还是有更好的方法

如果该变量被频繁使用,计时器是否能够读取该变量?或者,即使在更新该变量时存在旧值,计时器是否仍能够读取该变量

下面是一个大致的例子:

private static readonly object counterLock = new object();
int myCounter = 0;

private void FunctionExecutedByAllRunnningThreads()
{
    int executed = 0;
    foreach (some data)
    {
        //do something with this data
        executed++;
    }
    lock (counterLock)
        myCounter += executed;
}
我想知道的是,锁是更新变量的好方法还是有更好的方法

如果只是增加值,则可以使用来安全地增加值,而无需使用


如果要批处理此项,将允许您一次性将线程本地总值添加到计数器中,同样不锁定。

为此使用
Interlocked.add()
。(您不能使用
Interlocked.Increment()
,因为您似乎要向计数器中添加多个值)

.NET包含一种方法来安全地执行此操作

你也可以使用,而且还有很多其他有用的方法


感谢您的示例,但我添加总数的原因是为了尽可能少的插入,因为我将有几个线程使用它。
int myCounter = 0;

private void FunctionExecutedByAllRunnningThreads()
{
    int executed = 0;
    foreach (some data)
    {
        //do something with this data
        executed++;
    }
    Interlocked.Add(ref myCounter, executed);
}