从任务更新int变量?

Gua*_*apo 3 c# locking .net-4.0 task winforms

我目前有一个函数,它将根据数据量创建函数的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;
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 8

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

如果你只是递增值,你可以使用Interlocked.Increment安全地增加它而不需要lock.

如果你想批量处理它,Interlocked.Add将允许你一次性将你的线程局部总值添加到计数器,同样没有锁定.