Questions tagged «async-await»

这涵盖了使用async和await关键字的各种编程语言支持的异步编程模型。

5
导致死锁的异步/等待示例
我遇到了一些使用c#的async/ await关键字进行异步编程的最佳实践(我是c#5.0的新手)。 给出的建议之一如下: 稳定性:了解您的同步上下文 ...某些同步上下文是不可重入的和单线程的。这意味着在给定时间只能在上下文中执行一个工作单元。Windows UI线程或ASP.NET请求上下文就是一个例子。在这些单线程同步上下文中,很容易使自己陷入僵局。如果您从单线程上下文中生成任务,然后在上下文中等待该任务,则您的等待代码可能会阻止后台任务。 public ActionResult ActionAsync() { // DEADLOCK: this blocks on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { // a very simple async method var result = await MyWebService.GetDataAsync(); return result.ToString(); } 如果我自己剖析,则主线程会生成一个新线程MyWebService.GetDataAsync();,但是由于主线程在此等待,因此它将在中等待结果GetDataAsync().Result。同时,说数据准备好了。为什么主线程不继续其继续逻辑并从中返回字符串结果GetDataAsync()? 有人可以解释一下为什么上面的示例中出现死锁吗?我完全不知道问题是什么...

1
具有网络凭据的HttpClient.GetAsync
我目前正在使用HttpWebRequest该网站。我想使用await模式,这不是for给出的HttpWebRequests。我找到了该类HttpClient,它似乎是新的Http worker类。我正在HttpClient.GetAsync(...)查询我的网页。但是我缺少添加ClientCredentialslike 的选项HttpWebRequest.Credentials。有什么办法可以提供HttpClient身份验证信息吗?

4
一个好的尝试/捕获/最终解决方案?
我需要async在一个catch块中调用一个方法,然后再次引发异常(及其堆栈跟踪),如下所示: try { // Do something } catch { // <- Clean things here with async methods throw; } 但是很遗憾,您不能await在catch或finally块中使用。我了解到这是因为编译器没有任何办法可以返回一个catch块来执行await指令或类似指令之后的内容... 我试图用它Task.Wait()来替换await,但陷入僵局。我在网上搜索了如何避免这种情况的方法,并找到了该站点。 由于我无法更改async方法,也无法知道它们是否在使用ConfigureAwait(false),因此创建了这些方法,这些方法采用a Func<Task>,一旦我们在不同的线程上(以避免死锁),它就会启动异步方法并等待其完成: public static void AwaitTaskSync(Func<Task> action) { Task.Run(async () => await action().ConfigureAwait(false)).Wait(); } public static TResult AwaitTaskSync<TResult>(Func<Task<TResult>> action) { return Task.Run(async () => await action().ConfigureAwait(false)).Result; } public static …

4
“ await Task.Run();”之间的任何区别 返回;” 和“返回Task.Run()”?
以下两段代码之间在概念上有什么区别: async Task TestAsync() { await Task.Run(() => DoSomeWork()); } 和 Task TestAsync() { return Task.Run(() => DoSomeWork()); } 生成的代码是否也不同? 编辑:为避免与混淆Task.Run,类似的情况: async Task TestAsync() { await Task.Delay(1000); } 和 Task TestAsync() { return Task.Delay(1000); } 最新更新:除了可接受的答案,LocalCallContext处理方式也有所不同:即使没有异步,也可以还原CallContext.LogicalGetData。为什么?
90 c#  async-await 

4
为什么等待后HttpContext.Current为null?
我有以下测试WebAPI代码,我不在生产中使用WebAPI,但由于进行了有关此问题的讨论,所以进行了此操作:WebAPI异步问题 无论如何,这是令人讨厌的WebAPI方法: public async Task<string> Get(int id) { var x = HttpContext.Current; if (x == null) { // not thrown throw new ArgumentException("HttpContext.Current is null"); } await Task.Run(() => { Task.Delay(500); id = 3; }); x = HttpContext.Current; if (x == null) { // thrown throw new ArgumentException("HttpContext.Current is null"); …

1
等待是异步函数内部的保留字错误
我正在努力通过以下语法找出问题所在: export const sendVerificationEmail = async () => (dispatch) => { try { dispatch({ type: EMAIL_FETCHING, payload: true }); await Auth.sendEmailVerification(); dispatch({ type: EMAIL_FETCHING, payload: false })) } catch (error) { dispatch({ type: EMAIL_FETCHING, payload: false }); throw new Error(error); } }; 我不断收到错误消息: 等待是保留字 ...但是在异步函数中不合法吗? 调度位来自react-thunk库。

5
如何使用LINQ异步等待任务列表?
我有一个这样创建的任务列表: public async Task<IList<Foo>> GetFoosAndDoSomethingAsync() { var foos = await GetFoosAsync(); var tasks = foos.Select(async foo => await DoSomethingAsync(foo)).ToList(); ... } 通过使用.ToList(),任务应该全部开始。现在,我要等待其完成并返回结果。 这在上面的...块中有效: var list = new List<Foo>(); foreach (var task in tasks) list.Add(await task); return list; 它可以满足我的要求,但是看起来很笨拙。我宁愿这样写一些简单的东西: return tasks.Select(async task => await task).ToList(); ...但是不能编译。我想念什么?还是不可能以此方式表达事物?
87 c#  linq  async-await 

4
如何在循环中使用等待
我正在尝试创建一个异步控制台应用程序,该应用程序在集合上做一些工作。我有一个使用并行循环的版本,另一个使用异步/等待的版本。我期望async / await版本的工作方式类似于并行版本,但是它是同步执行的。我究竟做错了什么? class Program { static void Main(string[] args) { var worker = new Worker(); worker.ParallelInit(); var t = worker.Init(); t.Wait(); Console.ReadKey(); } } public class Worker { public async Task<bool> Init() { var series = Enumerable.Range(1, 5).ToList(); foreach (var i in series) { Console.WriteLine("Starting Process {0}", i); var …
86 c#  .net  async-await 

3
实体框架SaveChanges()与SaveChangesAsync()和Find()与FindAsync()
我一直在寻找以上两对之间的差异,但是没有找到任何清楚地解释它以及何时使用一个或另一个的文章。 那么SaveChanges()和之间有什么区别SaveChangesAsync()? 在Find()和之间FindAsync()? 在服务器端,当我们使用Async方法时,我们还需要添加await。因此,我认为它在服务器端不是异步的。 它仅有助于防止UI在客户端浏览器上阻塞吗?还是它们之间有什么优缺点?

9
在捕获块中等待
我有以下代码: WebClient wc = new WebClient(); string result; try { result = await wc.DownloadStringTaskAsync( new Uri( "http://badurl" ) ); } catch { result = await wc.DownloadStringTaskAsync( new Uri( "http://fallbackurl" ) ); } 基本上,我想从一个URL下载,当它失败并出现异常时,我想从另一个URL下载。当然这两个时间都是异步的。但是由于以下原因,代码无法编译 错误CS1985:无法在catch子句的主体中等待 好的,出于任何原因都被禁止,但是这里的正确代码模式是什么? 编辑: 好消息是C#6.0可能会允许catch和finally块中的等待调用。

4
是否有类似异步BlockingCollection <T>的东西?
我想await基于BlockingCollection&lt;T&gt;.Take()异步的结果,所以我不阻塞线程。寻找这样的事情: var item = await blockingCollection.TakeAsync(); 我知道我可以这样做: var item = await Task.Run(() =&gt; blockingCollection.Take()); 但这有点使整个想法付诸东流,因为(的ThreadPool)另一个线程被阻塞了。 还有其他选择吗?

5
在异步函数外使用await
我试图将两个异步函数链接在一起,因为第一个具有条件返回参数,导致第二个运行或退出模块。但是,我发现规格中找不到奇怪的行为。 async function isInLobby() { //promise.all([chained methods here]) let exit = false; if (someCondition) exit = true; } 这是我的代码的混帐摘要(您可以在此处看到完整的范围),它只是检查玩家是否已经在大厅中,但这无关紧要。 接下来,我们有这个异步功能。 async function countPlayer() { const keyLength = await scardAsync(game); return keyLength; } 如果,则无需运行此功能exit === true。 我试着做 const inLobby = await isInLobby(); 我希望可以等待结果,以便可以inLobby有条件地运行countPlayer,但是我收到了没有具体细节的typeerror。 为什么您不能await将async功能超出功能范围?我知道这是一个糖承诺,因此必须将其链接到其中,then但是为什么countPlayer我可以等待另一个诺言,但是在外面,我却不能await isInLobby呢?

5
在Windows应用商店应用中获取CoreDispatcher的正确方法
我正在构建Windows应用商店应用,并且我有一些代码需要发布到UI线程中。 为此,我想检索CoreDispatcher并使用它发布代码。 看来有几种方法可以这样做: // First way Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher; // Second way Window.Current.Dispatcher; 我不知道哪一个是正确的?还是两者相等?


6
如何防止任务上的同步继续?
我有一些库(套接字网络)代码,Task基于提供了一个基于API的未决请求响应TaskCompletionSource&lt;T&gt;。但是,TPL中有一个烦人之处在于,似乎不可能阻止同步继续。我会希望能够做的是两种: 告诉TaskCompletionSource&lt;T&gt;不允许呼叫者附加TaskContinuationOptions.ExecuteSynchronously,或者 设置结果(SetResult/ TrySetResult)的方式指定TaskContinuationOptions.ExecuteSynchronously应忽略的结果,而是使用池 具体来说,我的问题是传入的数据正在由专用的读取器处理,并且如果呼叫者可以附加TaskContinuationOptions.ExecuteSynchronously它们,则它们可能会使读取器停止运行(这不仅会影响读取器)。以前,我是通过一些黑客来解决此问题的,该黑客可以检测是否存在任何继续,如果将其继续,则将完成推送到上ThreadPool,但是如果调用者饱和了他们的工作队列,这将产生重大影响,因为不会处理完成及时地。如果他们正在使用Task.Wait()(或类似方法),则它们实际上将使自己陷入僵局。同样,这就是为什么阅读器使用专用线程而不使用工人的原因。 所以; 在尝试拖累TPL团队之前:我是否缺少选择? 关键点: 我不希望外部呼叫者能够劫持我的线程 我不能将ThreadPool用作实现,因为它在池饱和时需要工作 下面的示例产生输出(顺序可能会随时间而变化): Continuation on: Main thread Press [return] Continuation on: Thread pool 问题在于,一个随机调用者设法在“主线程”上获得了延续。在实际代码中,这会打断主要读者。坏事! 码: using System; using System.Threading; using System.Threading.Tasks; static class Program { static void Identify() { var thread = Thread.CurrentThread; string name = thread.IsThreadPoolThread ? "Thread pool" : thread.Name; …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.