【发布时间】:2018-04-04 00:40:08
【问题描述】:
目前,我很难理解使用异步和等待模式的多任务处理。为了获得一些基础知识,我编写了以下测试用例;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private int global_int = 10;
public async Task<int> RunAsyncTask()
{
// This method runs asynchronously.
await Task.Run(() => Calculate());
return global_int;
}
private int Calculate()
{
Console.WriteLine("Ticket count: " + --global_int);
return global_int;
}
private async void Start_Button_Click(object sender, RoutedEventArgs e)
{
List<Task<int>> list = new List<Task<int>>();
Console.WriteLine("\nReseting: " );
global_int = 10;
for (int i = 0; i < 10; i++)
{
var task = RunAsyncTask();
list.Add(task);
}
await Task.WhenAll(list.ToArray<Task<int>>());
Console.WriteLine("\nFinished: " + global_int);
}
}
想法/目标:
10 个客户,10 张票,每个客户买一张票,最后将没有可用的票。
问题:
当我运行代码时,我实际上得到的结果并不总是相同(总是期望 0 票)。真正的问题在哪里?
那么,我怎样才能以一种结果总是相同的方式编写代码。
输出 1:
Reseting:
Ticket count: 9
Ticket count: 8
Ticket count: 8
Ticket count: 7
Ticket count: 5
Ticket count: 6
Ticket count: 4
Ticket count: 3
Ticket count: 2
Ticket count: 1
Finished: 1
输出 2:
Reseting:
Ticket count: 9
Ticket count: 8
Ticket count: 7
Ticket count: 6
Ticket count: 5
Ticket count: 4
Ticket count: 3
Ticket count: 2
Ticket count: 1
Ticket count: 0
Finished: 0
【问题讨论】:
-
除了
--的问题,你会从int r = await RunAsyncTask();得到一个更好的想法,然后立即在GUI中使用r。
标签: c# async-await multitasking