如何从不同的任务中增加价值
How to add to value from different tasks
假设我有这样的东西(示例代码):
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
,我尝试制作一个更改值的锁定方法,但没有任何效果。
您是按值传递值,因此 val 永远不会改变。这段代码片段对我来说毫无意义,但通过引用传递和 Interlocked 就可以完成这项工作。
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();
}
}
假设我有这样的东西(示例代码):
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
,我尝试制作一个更改值的锁定方法,但没有任何效果。
您是按值传递值,因此 val 永远不会改变。这段代码片段对我来说毫无意义,但通过引用传递和 Interlocked 就可以完成这项工作。
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();
}
}