C#API-从另一个类调用异步任务
希望你一切顺利,我正在用谷歌API做一些测试。我在PHP for API方面的知识相当不错,但我在C#中很难做到这一点。我的目标是: 创建“JourneyPlanner”类 内部调用API查询以查找两个邮政编码之间的距离 打印距离 在PHP中相当简单,但在C#中很难找到类似的方法。我可以从Main方法很好地运行调用,但是当我尝试实现我的新类时,也就是当我遇到一些问题时 我的课程相当简单:C#API-从另一个类调用异步任务,c#,api,rest,C#,Api,Rest,希望你一切顺利,我正在用谷歌API做一些测试。我在PHP for API方面的知识相当不错,但我在C#中很难做到这一点。我的目标是: 创建“JourneyPlanner”类 内部调用API查询以查找两个邮政编码之间的距离 打印距离 在PHP中相当简单,但在C#中很难找到类似的方法。我可以从Main方法很好地运行调用,但是当我尝试实现我的新类时,也就是当我遇到一些问题时 我的课程相当简单: public class JourneyDistance { private
public class JourneyDistance
{
private static readonly HttpClient client = new HttpClient();
public async static Task GetPostCodeDistance()
{
string postCodeOne = "NR116BN";
string postCodeTwo = "PE129JE";
string url;
url = $"https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins={postCodeOne}&destinations={postCodeTwo}&mode=driving&key=APIKEY";
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
var o = JObject.Parse(responseBody);
Console.WriteLine(o);
string child1 = (string)o["rows"][0]["elements"][0]["distance"]["text"];
Console.WriteLine(child1);
}
}
我已经尝试了一些主要的方法,但我不能简单地运行这个方法,我的推理是,我希望在某个时候在整个系统中显示并运行这个API调用,所以需要能够在需要查询两个邮政编码时调用这个方法
public class Program
{
private static readonly HttpClient client = new HttpClient();
static void Main(string[] args)
{
JourneyDistance journeyDistance = new JourneyDistance();
//await journeyDistance.GetPostCodeDistance();
//journeyDistance.GetPostCodeDistance();
}
}
有人能帮忙吗?因为
GetPostCodeDistance
是一种异步方法,当第一个Wait
被点击时,它返回一个任务
,将控制权交还给调用者
此任务将在GetPostCodeDistance
完成处理后完成,但您需要等待它完成,否则您的应用程序可能会过早退出
在Main
方法中,可以执行以下操作:
journeyDistance.GetPostCodeDistance().GetAwaiter().GetResult();
它将阻止线程,直到任务完成
通常,在调用异步方法时应该避免阻塞线程,但是顶级Main
方法是此规则的一个例外
如果您使用的是C#7.1+,您还可以使Main
方法异步:
static async Task Main(string[] args)
{
JourneyDistance journeyDistance = new JourneyDistance();
await journeyDistance.GetPostCodeDistance();
}
虽然这只是语法上的糖分:
private static async Task MainAsync(string[] args)
{
JourneyDistance journeyDistance = new JourneyDistance();
await journeyDistance.GetPostCodeDistance();
}
public static void Main(string[] args)
=> MainAsync(args).GetAwaiter().GetResult();