Tag: async await

错误:找不到’async’修饰符所需的所有类型。 您是否针对错误的框架版本,或缺少对程序集的引用?

我有我的PC配置: Windows 8 Visual Studio 2012 .NET Framework 4.5 我的项目配置是: WP 7.1 Silverlight 4.0 .NET Framework 4.0 CTP ASYNC(已安装,使用async和await关键字) 该项目是在Windows 7机器上使用VS2010为WP7.1编写的。 现在我已经将PC升级到Windows 8并安装了VS2012。 然而,该项目抱怨’异步’修饰符。 找不到’async’修饰符所需的所有类型。 您是否针对错误的框架版本,或缺少对程序集的引用? 知道怎么解决这个问题吗? 谢谢!

为什么在不使用async / await关键字时异步unit testing失败?

根据这个讨论 ,以下两种方法应该没有区别: public async Task Foo() { await DoSomethingAsync(); } public Task Foo() { return DoSomethingAsync(); } 实际上,似乎对于非常简单的方法, 没有 async / await关键字的调用将是首选,因为它们会消除一些开销。 然而,这显然并不总是在unit testing中起作用。 MSTest的 [TestClass] public class AsyncTest { [TestMethod] public async Task Test1() { await Task.Delay(0); } [TestMethod] public Task Test2() { return Task.Delay(0); } } NUnit的 [TestFixture] public class AsyncTest { [Test] […]

使用async / await的信号量线程限制

我最近遇到了一个为异步/等待调用限制线程的例子。 在我的机器上分析和播放代码之后,我想出了一个稍微不同的做同样事情的方法。 我不确定的是,在引擎盖下发生的事情几乎是相同的,或者是否有任何微妙的差异值得注意? 这是基于原始示例的代码: private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(5); public async Task CallThrottledTasks() { var tasks = new List(); for (int count = 1; count { try { int result = await LongRunningTask(); Debug.Print(result.ToString()); } finally { _semaphore.Release(); } })); } await Task.WhenAll(tasks); Debug.Print(“Finished CallThrottledTasks”); } 这是我对相同代码的看法: private readonly SemaphoreSlim _semaphore = new […]

如何在.NET 4.0中使用Microsoft.Bcl.Async支持TransactionScope中的异步方法?

我有一个类似的方法: public async Task SaveItemsAsync(IEnumerable items) { using (var ts = new TransactionScope()) { foreach (var item in items) { await _repository.SaveItemAsync(item); } await _repository.DoSomethingElse(); ts.Complete(); } } 这当然有问题,因为TransactionScope不能与async / await一起使用。 它失败,并带有消息的InvalidOperationException : “TransactionScope必须放在创建它的同一个线程上。” 我在这个答案中读到了TransactionScopeAsyncFlowOption ,这看起来正是我需要的。 但是,对于这个特定项目,我很难支持.Net 4.0,无法升级到4.5或4.5.1。 因此,我的项目中的异步/等待行为由Microsoft.Bcl.Async NuGet包提供 。 我似乎无法在此包或任何其他OOB包中找到TransactionScopeAsyncFlowOption 。 我只是在某处错过了吗? 如果没有,是否有其他方法可以达到相同的效果? 也就是说 – 我希望事务范围正确完成或回滚,尽管跨越线程有延续。 我在上面的例子中添加了DoSomethingElse来说明在事务范围内可能有多个调用,所以在一次调用中简单地将所有项目传递给数据库是不可行的选择。 如果重要,存储库使用直接ADO.Net( SqlConnection , SqlCommand等)写入SQL Server。 UPDATE […]

Async MVC.NET操作方法阻止任何其他HTTP请求

(我为改变问题而道歉) 以下代码片段来自MVC.NET控制器(.NET:v4.5; AspNet.MVC:v5.2.3)。 调用LongOperation后,它: 产生一个过程 等待完成 监视一些LOG文件 使用SignalR从LOG文件通知浏览器进度 (为简单起见,我省略了代码) 所有这一切都有效,只有在LongOperation运行时,控制器才会处理其他 HTTP请求。 在LongOperation完成后处理它们并且action方法将结果返回给AJAX调用。 我搞砸了什么? 先感谢您。 更新(对于@angelsix评论):这是一个简化的设置: 我已根据建议删除了async / await 根据建议添加断点 已validation它们如上所述被击中 基本上:相同的结果,请参阅console.log-ed文本和时间戳欢迎来自社区的任何帮助。 先感谢您! GUI和日志 Controller中的操作方法 [AjaxOnly] public ActionResult _RunLongOperation(string hubId) { try { for (int i = 0; i < 10; i++) { Thread.Sleep(1000); ProgressNotifierHub.Notify(hubId, string.Format("Notification from _RunLongOperation {0}", i)); } return new HttpStatusCodeResult(HttpStatusCode.OK, "_RunLongOperation : […]

Task.Factory.StartNew vs Async方法

可能是一个微不足道的问题,但它可能有助于我的基本理解。 以下两个实现之间是否有任何重要区别? Task.Factory.StartNew : public Task ReadAllTextAsync(string path) { return Task.Factory.StartNew(() => File.ReadAllText(path)); } StreamReader上的异步方法: public async Task ReadAllTextAsync(string path) { using (var stream = File.OpenRead(path)) using (var reader = new StreamReader(stream)) { return await reader.ReadToEndAsync(); } }

如何正确使用Task.WhenAll()

我正在尝试使用Task.WhenAll等待完成多个任务。 我的代码如下 – 它应该启动多个异步任务,每个异步任务检索一个总线路由,然后将它们添加到本地arrays。 但是,Task.WhenAll(…)立即返回,并且本地路由数组的计数为零。 这看起来很奇怪,因为我希望每个任务中的各种“等待”语句意味着流程被暂停,并且任务在完成之前不会返回。 List monitoredTasks = new List(); foreach (BusRouteIdentifier bri in stop.services) { BusRouteRequest req = new BusRouteRequest(bri.id); // Start a new task to fetch the route for each stop Task getRouteTask = Task.Factory.StartNew(async () => { var route = await BusDataProviderManager.DataProvider.DataBroker.getRoute(req); // Add the route to our array (on UI […]

等待AsyncMethod()与等待等待等待Task.Factory.StartNew (AsyncMethod)

给定以下方法: public async Task DoSomethingAsync() { // do some work await OpenSomeFileAsync(); return new MyObject(); } 是否有区别: public async void SomeEventHandler(EventArgs args) { var myObject = await await Task.Factory.StartNew<Task>( DoSomethingAsync); // do something with myObject } 和: public async void SomeEventHandler(EventArgs args) { var myObject = await DoSomethingAsync(); // do something with myObject } 我认为DoSomethingAsync的“做一些工作”部分会在第一种情况下立即发生在新任务中,但说实话我并不完全理解Task,async和await是如何工作的,而且我很漂亮确定我只是为自己过度复杂的事情。 […]

如何使用异步方法对ViewModel进行unit testing。

我不知道从哪里开始,但让我简要介绍一下我在哪里以及我想要实现的目标。 我对MVVM上的unit testing很陌生,并且很难测试我使用PRISM委托命令属性公开的命令。 我的委托命令调用必须等待的异步方法,以便我可以获得实际结果。 下面是一个asyc方法,由我想测试的方法调用。 async void GetTasksAsync() { this.SimpleTasks.Clear(); Func<IList> taskAction = () => { var result = this.dataService.GetTasks(); if (token.IsCancellationRequested) return null; return result; }; IsBusyTreeView = true; Task<IList> getTasksTask = Task<IList>.Factory.StartNew(taskAction, token); var l = await getTasksTask; // waits for getTasksTask if (l != null) { foreach (ISimpleTask t in l) { […]

任务取消exception(ThrowForNonSuccess)

这是这个问题的延续: 多任务延续 我在答案中更改了我的代码,但是现在我在尝试运行任务时收到TaskCancelledExceptions 。 public virtual async Task RunAsync(TaskWithProgress task) { Show(); TaskIsRunning(); await SetCompletedHandler(TaskComplete()); await SetCancelledHandler(TaskCancelled()) await SetFaultedHandler(TaskFaulted()); await task; Close(); } 但是以下代码没有。 我有点卡住为什么。 public virtual Task RunAsync(TaskWithProgress task) { Show(); TaskIsRunning(); SetCompletedHandler(TaskComplete()); SetCancelledHandler(TaskCancelled()) SetFaultedHandler(TaskFaulted()); return task; } 调用代码基本上涉及以下内容: await progressDialog.RunAsync(task); 编辑: 我没有在任何地方取消cancellationtoken ,所以我不明白为什么这会抛出exception。 三个SetXXXHandler()方法基本上执行以下具有不同延续状态的代码: task.ContinueWith(_ => action(), CancellationToken.None, TaskContinuationOptions.OnlyOnCanceled, this.Scheduler); 堆栈跟踪在这里: at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task […]