Tag: 异步 等待

是.GetAwaiter()。GetResult(); 一般使用安全吗?

我在几个地方.GetAwaiter().GetResult(); 可能导致死锁,我们应该使用async / await代替。 但我看到许多使用它的代码示例。 可以使用它吗? 哪种情况可以陷入僵局? 还有其他我应该使用的东西,比如Task.Wait ?

为什么一直使用Async / await

我想澄清一下使用Await和Async的额外好处是什么。 如果我的应用程序正在调用await Func1() (这里没有阻止UI)。 并且Func1正在调用等待Func2() ,但是Func2()的结果对于Func1完成它的工作很重要,那么为什么我需要使Func2()等待。 Func1()执行将花费同样长的时间,因为它正在等待Func2完成。 await所做的就是添加StateMachine开销。 我在这里错过了什么吗?

在异步任务中使用HttpContext

我有以下mvc动作。 public async Task DoSomeLongRunningOperation() { return await Task.Run(() => { //Do a lot of long running stuff //The underlying framework uses the HttpContext.Current.User.Identity.Name so the user is passed on the messagebus. } } 在任务中,HttpContext变为null。 我们做了很多尝试,但没有任何事情让我们确信HttpContext总是在我们的新线程中可用。 有没有在异步任务中使用HttpContext的解决方案? 在我们的Io​​cContainer中,我们注册了以下对象,该对象将用户名传递给框架。 public class HttpContextUserIdentityName : ICredentials { public string Name { get { return HttpContext.Current.User.Identity.Name; } } } […]

我可以等待我用发电机创建的可枚举数吗?

假设我有异步获得的整数序列。 async Task GetI(int i){ return await Task.Delay(1000).ContinueWith(x => i); } 我想在该序列上创建一个生成器,如果序列是同步的,我会这样做: IEnumerable Method() { for (var i = 0; i < 100; i++) { yield return GetI(i); // won't work, since getI returns a task } } 所以,我认为类比是让生成器异步并从中产生: async Task<IEnumerable> Method() { for (var i = 0; i i); } } 这不起作用,因为带有yield的方法必须返回一个IEnumerable的东西,替代方案,更有意义的是IEnumerable<Task>但由于async方法必须返回Task s或void,因此无法编译。 现在,我意识到我可以简单地删除await并返回一个IEnumerable<Task>但这对我没有帮助,因为迭代会在任何数据准备就绪之前继续询问数据,所以它不能解决我的问题。 […]

使用Task.Delay()的成本是多少?

我正在考虑在具有事件驱动逻辑的MMO游戏服务器中使用C#async \ await。 让我们假设有数千个实体在已知持续时间内完成一些工作。 所以我想为每个游戏对象调用Time.Delay() 。 (这是对每个游戏对象进行一些Update()调用的常见无限循环的对立方法。) 有谁知道Task.Delay()是如何实现的? 它是否使用计时器? 系统资源是否很重? 是否可以产生数千个同时Task.Delay()调用?

我以为还在等待与调用者相同的线程,但似乎没有

我认为关于async / await的一点是,当任务完成时,继续在调用await时在相同的上下文上运行,在我的情况下,这将是UI线程。 例如: Debug.WriteLine(“2: Thread ID: ” + Thread.CurrentThread.ManagedThreadId); await fs.ReadAsync(data, 0, (int)fs.Length); Debug.WriteLine(“3: Thread ID: ” + Thread.CurrentThread.ManagedThreadId); 我不指望这个: 2: Thread ID: 10 3: Thread ID: 11 是什么赋予了? 为什么延续的线程ID与UI线程不同? 根据这篇文章 [^]我需要显式调用ConfigureAwait来改变连续上下文的行为!

async-await threading internals

我很好奇异步等待线程内部。 每个人都声明async在性能方面要好得多,因为它释放了等待长异步调用响应的线程。 好的我明白了。 但让我们考虑一下这种情况。 我有一个异步方法在数据库上执行异步操作。 数据库的api公开函数BeginQuery和事件QueryCompleted。 我用任务包装了那些(使用TaskCompletionSource)。 我的问题是调用BeginQuery和触发事件QueryCompleted之间的内幕。 我的意思是 – 它不需要产生某种工人来解雇事件吗? 在非常低的级别,它必须是一些阻止来自db的线程读取结果的同步循环。 我想是任何异步调用都必须生成一个线程来实际处理响应(可能在驱动程序代码中的低级c ++循环中等待它)。 因此,我们唯一的“收获”是当其他一些线程正在执行其工作时,可以释放调用者线程。 调用异步方法总是创建一个新的工作线程吗? 有人可以证实我的理解吗?

在不等待的情况下调用异步方法

我试图在不等待结果的情况下调用异步方法(在ASP.NET Web API 2应用程序中)。 我的意思是我想要主线程继续执行并且不等待被调用的方法来完成。 我正在尝试这个片段: // The async method: private static async Task LogAsync(Exception exception, string ip, MethodBase method, object parameters) { // some stuff } // The caller methods: public static void Log1(Exception exception, object parameters) { LogAsync(exception, ip, method, parameters); } public static void Log2(Exception exception, object parameters) { Task.Factory.StartNew(() => LogAsync(exception, […]

为什么在QueueBackgroundWorkItem中使用异步?

使用ASP.NET QueueBackgroundWorkItem方法的async有什么好处? HostingEnvironment.QueueBackgroundWorkItem(async cancellationToken => { var result = await LongRunningMethodAsync(); // etc. }); 我的理解是异步函数用于防止长时间运行的任务阻塞主线程。 但是,在这种情况下,我们不是要在自己的线程中执行任务吗? 与非异步版本相比有什么优势: HostingEnvironment.QueueBackgroundWorkItem(cancellationToken => { var result = LongRunningMethod(); // etc. });

我应该使用等待异步Action方法吗?

我需要在我的Controller中实现一个异步Action,用于长时间运行的外部API调用。 看一些教程,我已经实现了我的方法: [AsyncTimeout(200)] public async Task DoAsync() { // Execute long running call. return View(); } 我的问题是,这足以使真正的非块异步吗? 我是否还需要应用await运算符,如果是,我该怎么做?