我目前有一个函数可以根据数据量创建函数的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;
}
答案 0 :(得分:8)
我想知道的是,锁定是更新变量的好方法还是有更好的方法?
如果您只是递增值,则可以使用Interlocked.Increment在没有lock
的情况下安全递增值。
如果您想批量处理,Interlocked.Add将允许您一次性将您的线程局部总值添加到计数器,再次无需锁定。
答案 1 :(得分:2)
使用Interlocked.Add()
。 (您不能使用Interlocked.Increment()
,因为您似乎向计数器添加了多于1个)
答案 2 :(得分:1)
.NET包含一种安全地为您执行此操作的方法。 Interlocked.Increment
你也可以使用Interlocked.Add
,Interlocked
int myCounter = 0;
private void FunctionExecutedByAllRunnningThreads()
{
int executed = 0;
foreach (some data)
{
//do something with this data
executed++;
}
Interlocked.Add(ref myCounter, executed);
}