using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
namespace TestAsync
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("1. Calling process at {0:mm.ss.fff}", DateTime.Now);
// Call 1
Process();
Console.WriteLine("1. Calling process at {0:mm.ss.fff}", DateTime.Now);
// Call 2
Process();
Console.ReadKey();
}
private static void Process()
{
Console.WriteLine("2. Calling CallAsyncTest at {0:mm.ss.fff}", DateTime.Now);
for (int i = 1; i < 4; i++)
{
// Try 1 - doesn't work
//CallAsyncTest(i);
// Try 2 - doesn't work
//Task.Run(async () => await CallAsyncTest(i));
// Try 3 - but works not recommended
CallAsyncTest(i).Wait();
// Try 4 - doesn't work
//CallAsyncTest(i).ConfigureAwait(false); ;
}
}
private static async Task CallAsyncTest(int i)
{
Console.WriteLine("{0}. Calling await AsyncTest.Start at {1:mm.ss.fff}", i + 2, DateTime.Now);
var x = await AsyncTest.Start(i);
}
}
public class AsyncTest
{
public static async Task<string> Start(int i)
{
Console.WriteLine("{0}. Calling await Post<string> at {1:mm.ss.fff}", i + 3, DateTime.Now);
return await Post<string>(i);
}
private static async Task<T> Post<T>(int i)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
using (HttpClient httpClient = new HttpClient(new HttpClientHandler()))
{
using (HttpResponseMessage response = await httpClient.GetAsync("https://www.google.com"))
{
using (HttpContent content = response.Content)
{
string responseString = await content.ReadAsStringAsync();
Console.WriteLine("response");
}
}
}
return default(T);
}
}
但这些是唯一真正使代码同步的版本
完全正确,你不应该仅仅因为这个原因而使用它。您不希望在执行I/O时锁定主线程,或者您的应用程序是最字面意义上的垃圾。
无论出于何种原因,如果您不想让整个应用程序异步
,您仍然可以使用正确的异步
模式。请记住,Await
只不过是围绕task
类提供的语法糖:一种在任务完成后继续的方法。
我可能还不够清楚--情况是,我的现有代码不支持异步,我希望使用新的库,如System.net.http和只支持异步方法的AWS SDK。因此,我需要弥补这一差距,并能够拥有可以同步调用的代码,然后可以在其他地方调用异步方法。 我读了很多书,有很多次有人问这个问题,也有人回答这个问题。 从非异步方法调用异步方法
没有await并且在非异步方法中调用异步方法的行为是什么?我这样问是因为我看到Visual Studio在调用异步方法时没有显示任何警告,好像这是一件非常正常的事情。在这种情况下,异步方法的行为是否像是同步的?
最早的的使用异步操作的时候,我们一般会用setTimeout,会出现回掉地狱的情况 setTimeout(()=>{ setTimeout(()=>{ setTimeout(()=>{ console.log('1') },1000) },1000) },1000) ES6中Promise //promise ()=>{ axios.post('/user/
我(大部分)了解CompletableFuture的三种执行方法: 非异步(同步执行) 默认异步(使用默认执行器异步) 自定义异步(使用自定义执行器异步) 我的问题是:什么时候应该支持使用非异步方法? 如果您有一个调用其他方法的代码块,该代码块也返回CompletableFuture,会发生什么?表面上看,这可能很便宜,但如果这些方法也使用非异步调用,会发生什么?这难道不是一个很长的非异步块,可能
同步调用异步方法最安全的方法是什么?