Tag: async await

异步任务被评估两次

我使用以下方法异步并同时执行某些任务: public async Task<Dictionary> Read(string[] queries) { var results = queries.Select(query => new Tuple<string, Task>(query, LoadDataAsync(query))); await Task.WhenAll(results.Select(x => x.Item2).ToArray()); return results .ToDictionary(x => x.Item1, x => x.Item2.Result); } 我希望该方法同时为数组中的每个字符串调用LoadDataAsync ,然后等待所有任务完成并返回结果。 如果我运行这样的方法,它会为每个项调用两次LoadDataAsync ,一次在await …行,一次在最终的.Result属性getter。 如果我删除await …行,Visual Studio会警告我整个方法将并行运行,因为在方法内部没有await调用。 我究竟做错了什么? 是否有更好(更短)的方法来做同样的事情?

MVC4 WebApi进程启动器

我有一个MVC4 API REST尝试在新线程中启动进程。 我正在使用框架4.5并尝试使用sync和等待clausules。 我的代码看起来像: [AcceptVerbs(“POST”)] public HttpResponseMessage Launch(string id) { runProcessAsync(id); // 1 return Request.CreateResponse(HttpStatusCode.Accepted); // 2 } protected async void runProcessAsync(string id) { int exitcode = await runProcess(id); // 3 string exitcodesz = string.Format(“exitcode: {0}”, exitcode); // 4 // do more stuff with exitcode } protected Task runProcess(string id) { var tcs = […]

TestMethod:异步任务TestSth()不适用于.NET 4.0

我正在尝试使用.NET 4.0 BCL Async和MsTest运行异步测试方法。 由于测试用例资源管理器中缺少条目,此设置似乎无法处理[TestMethod] async Task TestSth() 。 将签名更改为async void后 ,我可以运行测试用例但结果错误(根本不会报告任何错误)。 我已经看到了使用TFS 2010运行异步任务unit testing的一个问题,但我认为应该有一个更漂亮的方法来解决这个问题。 有什么建议?

什么是Microsoft.Bcl.Async?

什么是Microsoft.Bcl.Async以及它用于什么? 我在包页面上看到: 此程序包使Visual Studio 2012项目能够使用新的“异步”和“等待”关键字。 但是可以看到我的VS2012支持异步并等待没有任何额外的包。 那么我应该为我的C#4.5’异步’项目安装软件包吗?

使用嵌套的异步调用进行锁定

我正在开发一个multithreadingWindowsPhone8应用程序,该应用程序在异步方法中具有关键部分。 有没有人知道在C#中正确使用信号量/互斥量的方法,其中你使用嵌套的异步调用,其中内部方法可能获取它已经获取了调用堆栈的相同锁? 我认为SemaphoreSlim可能是答案,但看起来它会导致死锁。 public class Foo { SemaphoreSlim _lock = new SemaphoreSlim(1); public async Task Bar() { await _lock.WaitAsync(); await BarInternal(); _lock.Release(); } public async Task BarInternal() { await _lock.WaitAsync(); // deadlock // DO work _lock.Release(); } }

AsyncLocal 在非异步/等待代码中的作用是什么?

我正在研究桌面winform应用程序的一个非常大的旧代码库。 在此代码库中,有许多操作在后台线程中执行,主要使用BackgroundWorker 。 此代码库中的一个常见模式是通过将工件绑定到正在执行的线程来隐藏复杂性。 例如,数据库连接和事务存储在[ThreadStatic]字段中。 我正在尝试更改此设置,并开始使用async/await代码,并从在池的任何线程中运行任务中受益,并允许任务通过使用ConfigureAwait(false)继续在任何其他线程中执行。 我知道[ThreadStatic]与async/await不兼容,我在这里读了几个答案,建议使用AsyncLocal 。 鉴于我正在开发大型代码库,如前所述,我无法一次性切换到async/await ,我必须逐步进行此更改。 因此之前[ThreadStatic]的代码将更改为AsyncLocal ,但代码的大部分将继续使用BackgroundWorker并且不会命中单个async/await代码行。 题 这会有用吗? 我需要能够定义某种上下文流程,它将与我的新async/await代码一起使用,并且还继续使用依赖于[ThreadStatic]旧的非异步代码,保持每个线程内容彼此独立。 如果我完全错了,走错了路,建议非常受欢迎。

等待多个任务的时间是否比第一个例外更多?

今天我的同事和我讨论了如何正确处理C#5.0 async方法中的exception,我们想知道是否同时等待多个任务也会观察到运行时未解包的exception。 请考虑以下代码段: async Task ExceptionMethodAsync() { await Task.Yield(); throw new Exception(); } async Task CallingMethod() { try { var a = ExceptionMethodAsync(); var b = ExceptionMethodAsync(); await Task.WhenAll(a, b); } catch(Exception ex) { // Catches the “first” exception thrown (whatever “first” means) } } 现在第二项任务会发生什么? 两者都处于故障状态,但是现在观察到还是未观察到的第二个任务exception?

Await或Task.FromResult

我有一个服务可以说, public interface ISomeService { Task DoSomeExpensiveCheckAsync(string parameter); } 我有这个课程来消费这项服务。 它只需要做一些简单的空检查,然后返回服务响应。 public class SomeServiceConsumer { private readonly ISomeService _serviceClient; public SomeServiceConsumer(ISomeService serviceClient) { _serviceClient = serviceClient; } public async Task DoSomething1Async(string someParameter) { if (string.IsNullOrWhiteSpace(someParameter)) { return false; } return await _serviceClient.DoSomeExpensiveCheckAsync(someParameter); } //No async or await keywords public Task DoSomething2Async(string someParameter) { if (string.IsNullOrWhiteSpace(someParameter)) […]

具有收益率返回的异步任务?

以下方法无法编译。 备择方案? public static async Task<IEnumerable> GetRecordsAsync( this Transaction transaction, string commandText, params SqlParameter[] parameters) { // Get a SqlDataReader var reader = await transaction.GetReaderAsync(commandText, parameters); var fieldCount = -1; // Begin iterating through records asynchronously while (await reader.ReadAsync()) // Note we don’t loop until .ReadAsync returns a boolean { // Grab all the field […]

C#异步等待使用LINQ ForEach()

我有以下代码正确使用async / await范例。 internal static async Task AddReferencseData(ConfigurationDbContext context) { foreach (var sinkName in RequiredSinkTypeList) { var sinkType = new SinkType() { Name = sinkName }; context.SinkTypeCollection.Add(sinkType); await context.SaveChangesAsync().ConfigureAwait(false); } } 如果不是使用foreach(),我想使用LINQ ForEach(),那么写这个的等效方法是什么? 例如,这个给出了编译错误。 internal static async Task AddReferenceData(ConfigurationDbContext context) { RequiredSinkTypeList.ForEach( sinkName => { var sinkType = new SinkType() { Name = sinkName }; […]