3

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

目前我所有的 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;
}
4

3 回答 3

8

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

如果您只是增加值,则可以使用Interlocked.Increment安全地增加它而无需lock.

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

于 2012-06-21T15:08:22.720 回答
2

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

于 2012-06-21T15:08:54.243 回答
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);
}
于 2012-06-21T15:08:54.893 回答