从任务更新int变量?

时间:2012-06-21 15:06:27

标签: c# winforms .net-4.0 locking task

我目前有一个函数可以根据数据量创建函数的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;
}

3 个答案:

答案 0 :(得分:8)

  

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

如果您只是递增值,则可以使用Interlocked.Increment在没有lock的情况下安全递增值。

如果您想批量处理,Interlocked.Add将允许您一次性将您的线程局部总值添加到计数器,再次无需锁定。

答案 1 :(得分:2)

使用Interlocked.Add()。 (您不能使用Interlocked.Increment(),因为您似乎向计数器添加了多于1个)

答案 2 :(得分:1)

.NET包含一种安全地为您执行此操作的方法。 Interlocked.Increment

你也可以使用Interlocked.AddInterlocked

还有很多其他有用的方法
int myCounter = 0;

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