c# - 在第二个依赖于第一个时执行异步任务
问题描述
我需要一些关于异步编程的帮助。为简单起见,考虑一个整数列表 2, 1, 3, 3, 4, 5
我有两个异步任务。一个获取记录,另一个创建记录。如果 id 属性尚不存在,我只想创建一条记录。
public async Task<Record> GetRecord(int id)
{
var client = new HttpClient();
// build request
// var response = await client.SendAsync(request); // sending to 3rd party vendor
// depending on response, return the Record object or null
}
public async Task<bool> CreateRecord(int id)
{
var client = new HttpClient();
// build request
// var response = await client.SendAsync(request); // sending to 3rd party vendor
// depending on response, return true or false
}
主程序
foreach(var id in IDs)
{
var record = await GetRecord(id); ?? How can I wait here
if (record == null)
await CreateRecord(id)
}
出于某种原因,该程序正在创建具有 2、1、3、3、4、5 的记录。它不应该创建具有 id 3 的重复记录。
我也尝试了以下方法,但它也会创建重复记录
var record = Task.Run( async => await GetRecord(id)).Result
任何帮助将不胜感激。
解决方案
这是我尝试展示的示例,它应该可以正常工作。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace TestSync
{
public class Record
{
public int Id { get; set; }
public Record(int id)
{
this.Id = id;
}
}
public class TestClass
{
private List<Record> SavedRecords = new List<Record>();
private List<int> Ids = new List<int>{1, 2, 1, 3, 3, 4, 5, 3, 3, 4, 4, 2, 2};
private Random randome = new Random(8383838);
public async Task Process()
{
foreach (var id in Ids)
{
var record = await GetRecord(id);
if (record == null)
await CreateRecord(id);
}
}
public async Task<Record> GetRecord(int id)
{
await Task.Delay(randome.Next(100, 200));// simulate delay for a HttpClient kind of call
return SavedRecords.FirstOrDefault(i => i.Id == id);
}
public async Task<bool> CreateRecord(int id)
{
await Task.Delay(randome.Next(200, 500));// simulate delay for a HttpClient kind of call
SavedRecords.Add(new Record(id));
return true;
}
public void Print()
{
foreach (var record in SavedRecords)
Console.WriteLine(record.Id);
}
}
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("Creating records!");
var t = new TestClass();
await t.Process();
t.Print();
Console.WriteLine("Done creating records!");
Console.ReadKey();
}
}
}
推荐阅读
- json - Google 表格 JSON 提要 - 我想要数据而不是架构
- javascript - 在 JavaScript 中实现递归回溯?
- json - 使用 jq 将带有换行符的文本文件转换为 json
- angular - Angular 9 - 属性“消毒剂”是私有的,只能在类内访问
- r - 坚持使用 R str_detect 需要正则表达式
- java - 制作一个返回数组中一位数字的数量的方法
- python - 转义 f 字符串中的单括号
- flutter - Flutter 驱动程序 - 在屏幕外的字段中输入文本
- android - Xamarin 将 EditText 从片段传递到片段
- hash - 查找计算元组流中项目平均值的哈希函数