Tag: async await

为什么在等待任务返回方法时出现InvalidCastException?

(问题的真正标题应该是“为什么我得到一个’无法播放’System.Runtime.CompilerServices.TaskAwaiter`1 [System.Runtime.CompilerServices.VoidTaskResult]’类型的对象’来键入’System.Runtime.CompilerServices .INotifyCompletion’“,但不幸的是,这对StackOverflow来说太长了。:) 嗨, 当我试图await执行我的方法时,我遇到了一些特殊的问题。 调用代码看起来像这样(摘录): private async Task DownloadAddonFileAsync(dynamic addon, dynamic file, string targetFolder) { // … await DownloadFileAsync(file, targetFolder, uri); DownloadFileAsync看起来像这样: protected async Task DownloadFileAsync(dynamic file, string targetFolder, string uri) { // … var fileBytes = await AppLoaderRestClient.GetAsync(uri); 反过来,AppLoaderRestClient.GetAsync()看起来像这样: public static async Task GetAsync(string uri) { // … if (typeof (T) == typeof […]

RegAsm无法使用Microsoft.Bcl.Async进行.NET 4.0程序集

使用Microsoft.Bcl.Async的.NET 4.0程序集的RegAsm失败,并显示以下消息: RegAsm:错误RA0000:无法加载文件或程序集 ‘System.Threading.Tasks,Version = 1.5.11.0,Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a’或其依赖项之一。 找到的程序集的清单定义不匹配 assembly参考。 (HRESULTexception:0x80131040) 我的程序集( MyAssembly.dll )使用最新的Microsoft.Bcl.Async NuGet包,这是项目的packages.config : 它捆绑了System.Threading.Tasks.dll版本:2.6.6.0,它是该NuGet包的一部分。 目标系统上没有其他System.Threading.Tasks.dll (Win7 with .NET 4.0但没有.NET 4.5),GAC和其他任何地方都没有。 这是MyAssembly.dll.config ,它具有System.Threading.Tasks正确bindingRedirect元素: 我的问题: RegAsm不使用MyAssembly.dll.config吗? 如何使其工作以解决bindingRedirect指令?

仅当任务未在指定时间内完成时才显示进度对话框

我有一个上传图像的servlets,我这样使用它: ImageInfo result = await service.UploadAsync(imagePath); 我想要做的是显示进度对话框,但前提是上传操作需要超过2秒。 上传完成后,我想关闭进度对话框。 我使用Task / ContinueWith做了一个粗略的解决方案,但我希望有一种更“优雅”的方式。 如何使用async/await实现此目的?

“async void”WPF命令处理程序中的exception处理

我正在审查我的同事的一些WPF代码,这是一个基于UserControl的组件库 ,包含许多async void事件和命令处理程序。 这些方法目前不在内部实现任何error handling 。 代码简而言之: private async void NewCommand_Executed(object sender, ExecutedRoutedEventArgs e) { // do some fake async work (and may throw if timeout < -1) var timeout = new Random(Environment.TickCount).Next(-100, 100); await Task.Delay(timeout); } 抛出exception但在NewCommand_Executed未观察到的exception只能在全局级别上处理 (例如,使用AppDomain.CurrentDomain.UnhandledException )。 显然,这不是一个好主意。 我可以在本地处理exception: private async void NewCommand_Executed(object sender, ExecutedRoutedEventArgs e) { try { // do some […]

当等待是最后一次时,不必要的异步/等待?

我最近一直在处理异步等待 (阅读包括斯蒂芬和乔恩最后两章在内的所有可能的文章),但我得出结论,我不知道它是否100%正确。 – 因此我的问题。 由于async只允许单词等待存在,我将把async放在一边。 AFAIU等待着继续。 而不是编写function(连续)代码,写同步代码。 (我想将其称为可回调代码) 因此,当编译器到达await – 它将代码分成2个部分,并在第一部分完成后注册要执行的第二部分( 我不知道为什么不使用单词callback – 这正是所做的 ) 。 (同时工作 – 线程回来做其他事情)。 但看看这段代码: public async Task ProcessAsync() { Task workTask = SimulateWork(); string st= await workTask; //do something with st } public Task SimulateWork() { return … } 当线程到达await workTask; 它将方法分为2个部分。 所以在SimulateWork完成之后 – 方法的继续:AKA: //do something with st执行//do […]

从async / await方法返回列表

我想以异步方式提出Web服务请求。 我在这里称呼它: List list = GetListAsync(); 这是我的函数的声明,它应该返回一个列表: private async Task<List> GetListAsync(){ List list = await Task.Run(() => manager.GetList()); return list; } 如果我想编译我得到以下错误 Cannot implicitely convert type System.Threading.Tasks.Task<System.Collections.Generic.List> to System.Collections.Generic.List 据我所知,如果我使用async修饰符,结果会自动包含在Task中。 我认为这不会发生,因为我使用Task.Run 。 如果我删除Task.Run(() =>部分我得到 无法等待System.Collections.Generic.List表达式 我想我还没有完全理解async / await方法。 我做错了什么?

使用ConfigureAwait进行C#async / await链接(false)

基于众多书籍和博客,包括这里的优秀书籍,很明显当一个人写一个暴露助手异步方法的DLL库,即包装器方法时,通常认为内部完成实际异步方法的I / O任务的最佳实践在这样的线程池线程上(为了简洁起见,下面显示了伪代码,我以HttpClient为例) public Async Task MyMethodAsync(..) { … var httpClient = new HttpClient(..); var response = await httpClient.PostAsJsonAsync(..).ConfigureAwait(false); … return response; } 这里的关键是使用ConfigureAwait(false)以便在线程池线程上而不是在原始线程上下文上发生IO任务完成,从而可能防止死锁。 我的问题是从来电者的角度来看。 我对调用者和上面的方法调用之间存在多层方法调用的情况特别感兴趣,如下例所示。 CallerA -> Method1Async -> Method2Async -> finally the above MyMethodAsync 仅对最终方法使用ConfigureAwait(false)是否足够,还是应该确保Method1Async和Method2Async还在内部使用ConfigureAwait(false)调用其异步方法? 将它包含在所有这些中间方法中似乎很愚蠢,特别是如果Method1Async和Method2Async只是最终调用MyMethodAsync重载。 有任何想法,请指教! 更新了示例所以如果我有一个包含以下私有异步方法的库, private async Task MyPrivateMethodAsync(MyClass myClass) { … return await SomeObject.ReadAsStringAsync().ConfigureAwait(false); } 我应该确保以下公共重载方法还包括ConfigureAwait(false),如下所示? public async Task […]

UOW – 在上一次异步操作完成之前,在此上下文中启动了第二个操作

我正在尝试下面的代码,它有两个部分,一个是通过棱镜导航。 当允许导航时,我以异步方式开始深度加载,但每次都使用新的上下文。 在以后的代码中,我想要取消未完成此加载的待处理导航,但下面的代码甚至不起作用,因此取消是稍后的事情;-) 导航逻辑:这里没问题 public void OnNavigatedTo(NavigationContext navigationContext) { int relatieId = (int)navigationContext.Parameters[“RelatieId”]; if (_relatie != null && _relatie.RelatieId == relatieId) return; loadRelatieAsync(relatieId); } public void ConfirmNavigationRequest(NavigationContext navigationContext, Action continuationCallback) { bool navigationAllowed = true; continuationCallback(navigationAllowed); } 深度加载逻辑: private async Task loadRelatieAsync(int relatieId) { try { await Task.Run(async () => { _unitOfWork = _UnitOfWorkFactory.createUnitOfWorkAsync(); IEnumerable […]

使用Async和Await进行异步编程

我正在阅读本教程,了解如何在c#中异步编程并遇到错误我不知道如何解决。 这是链接: http : //msdn.microsoft.com/en-us/library/hh191443.aspx ,错误是: Cannot find all types required by the ‘async’ modifier. Are you targeting the wrong framework version, or missing a reference to an assembly? 我的目标是.NET 4.0框架,并且不确定是否需要任何其他程序集。 这是代码: public async Task AccessTheWebAsync(Class1 class1, Class2 class2) { // GetStringAsync returns a Task. That means that when you await the // task you’ll […]

任务继续与async / await并行执行

在使用async / await结构的控制台应用程序的上下文中,我想知道“continuation”是否可以在不同CPU上的多个线程上并行运行。 我认为就是这种情况,因为延迟发布在默认任务调度程序(控制台应用程序中没有SynchronizationContext)上,这是线程池。 我知道async / await构造不构造任何额外的线程。 仍然应该由线程池为每个CPU构建至少一个线程,因此如果在线程池上发布了continuation,它可以在不同的CPU上并行调度任务延续…这就是我的想法,但出于某种原因我昨天对此我真的很困惑,我不再那么肯定了。 这是一些简单的代码: public class AsyncTest { int i; public async Task DoOpAsync() { await SomeOperationAsync(); // Does the following code continuation can run // in parrallel ? i++; // some other continuation code …. } public void Start() { for (int i=0; i<1000; i++) { var _ = […]