c# - 从任务更新一个 int 变量?

标签 c# winforms .net-4.0 locking task

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

目前我所有的 UI 都是从一个计时器更新的,所以我不会委托(delegate)线程来更新 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;
}

最佳答案

What I would like to know is, would a lock be a good way to update the variable or is there a better way?

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

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

关于c# - 从任务更新一个 int 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11141113/

相关文章:

VB.NET 4.0 Parallel.ForEach AddressOf 多个值?

c# - 套接字断开通知方法

c# - 任务并行库代码在 Windows 窗体应用程序中卡住 - 作为 Windows 控制台应用程序正常工作

c# - 退出应用程序时(使用中)关闭使用的WinSCP session

按钮上的 C# 图标(调整大小)

c# - 在透明像素上使用 DrawString 呈现错误的文本

c# - 根据安装的 Net Framework 版本运行不同的代码

c# - 比较两个大型通用列表

c# - 与 Parameters.Add 和 Parameters.AddWithValue 的区别

c# - 在这种特定且非常简单的情况下,为什么 Debug 不同于 Release?