如何从不同的任务中增加价值

Posted

技术标签:

【中文标题】如何从不同的任务中增加价值【英文标题】:How to add to value from different tasks 【发布时间】:2021-10-11 14:10:37 【问题描述】:

假设我有一些看起来像这样的东西(示例代码):

public int val = 0;
public Task[] Tasks = new Task[3];

private void Run()

    for (int i = 0; i <= Tasks.Count(); i++)
    
        Tasks[i] = Task.Run(() =>
        
            changeValue(val);
        );
    
    foreach (var task in Tasks)
    
        try
        
            task.Wait();
        
        catch  
    


public static void changeValue(int value)

    for (int i = 0; i <= 100; i++)
    
        value++;
        MessageBox.Show(value.ToString());
    

在我的例子中,这个值的上限为 100,因为每个任务都在独立更改它,但我希望它的上限为 300,因为有 3 个任务(对于本示例),我希望它们一起更改值。

有谁知道什么可以帮助我解决这个问题?我尝试过public volatile int val,并尝试创建一个更改值的锁定方法,但没有任何效果。

【问题讨论】:

lock 语句或 Interlocked 静态类应该有帮助 例如Monitor。 @Serg 感谢您的回答,事实证明这正是我所需要的,如下面的回答所示 请永远不要再像这样给catch 编码。 【参考方案1】:

你是按值传递值,所以 val 永远不会改变。这段代码 sn-p 对我来说没有意义,但是通过引用传递和联锁就可以了。

public class C1

    public int Val => val;
    private int val = 0;
    public Task[] Tasks = new Task[3];  // Why is this public?

    public async Task Run()
    
        // <= is wrong!
        for (int i = 0; i < Tasks.Length; i++)
        
            Tasks[i] = Task.Run(() =>
            
                C2.ChangeValue(ref val);
            );
        
        await Task.WhenAll(Tasks);
    


public class C2

    public static void ChangeValue(ref int value)
    
        // < instead of <=
        for (int i = 0; i < 100; i++)
        
            System.Threading.Interlocked.Add(ref value, 1);
            Console.WriteLine(value);  // Or Messagebox
        
    


public class Program

    private static async Task Main(string[] args)
    
        var c1 = new C1();
        await c1.Run();
    

【讨论】:

解决了!非常感谢,代码 sn-p 并不是真正要运行的,我只是快速编写了代码来传达这个想法。我知道我必须使用 Interlocked,但我不明白如何处理它,但这清除了它

以上是关于如何从不同的任务中增加价值的主要内容,如果未能解决你的问题,请参考以下文章

如何从这个长的 json 文件中获取价值,它会在新交易后自行增加,我需要最新的交易

如何管理需要由 AsyncTask 调用的不同任务

IOS Swift我如何从异步方法中获得价值[重复]

如何从输入中获取价值?

如何提升分享信息的价值

跃优堂:在信息化时代如何通过互联网平台增加收益?