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