gpt4 book ai didi

c# - 从 C# 中的多个异步方法(即线程)增加值类型

转载 作者:太空狗 更新时间:2023-10-29 23:13:44 25 4
gpt4 key购买 nike

我需要从 C# 中的多个线程(异步方法)增加一个计数器。

  • 我不能传递 ref 参数,因为它是一个异步方法
  • 我不能只更新值(或锁定它),因为它是一个值类型
  • 我无法使用 Interlocked,因为我无法在异步方法中将 ref 放入计数器

所以我唯一想到的就是做一些像 List<int> 这样的傻事并把我的 int在那里,线程可以锁定列表并更新值。

我希望这是一个已知的用例,并且有更优雅的方式来实现它?

这是一个小例子,不要在意小的语法问题:

public void DoStuff()
{
int counter;
var tasks = new List<Task>()
for(int i = 0; i < 10; i++)
{
tasks.Add(AsyncMethod(<SOMETHING>));
}
Task.WaitAll(tasks);
Console.WriteLine("Total: {0}", counter);
}

public async Task AsyncMethod(<SOMETHING>)
{
// Lock if needed by <SOMETHING>
<SOMETHING>+=20;
}

我需要创建一个带有 int 的类吗?字段,或者 C# 是否提供现成的东西?我并没有坚持这一点,只是想事后学习是否有更好的方法。谢谢!

对于 future 的访客:共识似乎是创建一个自定义类,例如 class IntHolder { public int Value {get;set;}}可以通过引用传递并锁定(或使用 Interlocked on)

非常感谢大家!

最佳答案

您可以在任何对象上使用lock,而不仅仅是您要使用的对象。

例如:

object locking_object = new object();

这将创建一个仅用于锁定的对象。

然后,当您想要增加值时:

lock(locking_object)
{
integer++;
}

根据评论更新:

像这样创建一个类来保存整数值:

class IntHolder
{
public int Value;
}

您可以使用 Interlocked 类来执行如下操作:

Interlocked.Increment(ref int_holder.Value);

其中 int_holder 是您传递给方法的 IntHolder 类型变量的名称。

关于c# - 从 C# 中的多个异步方法(即线程)增加值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32832770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com