Tag: async await

如何使用timout取消TaskCompletionSource

我有一个函数,我使用await关键字异步调用: public Task RequestStateForEntity(EntityKey entity, string propName) { var tcs = new TaskCompletionSource(); try { var propInstance = BuildCacheKey(entity, propName); StateCacheItem cacheItem; if (_stateCache.TryGetValue(propInstance, out cacheItem)) { tcs.SetResult( new StateInfo (cacheItem.State.Name, cacheItem.State.Value) ); return tcs.Task; } //state not found in local cache so save the tcs for later and request the state var cacheKey = […]

等待异步TaskEx

什么是TaskEx ? 在http://www.i-programmer.info/programming/c/1514-async-await-and-the-ui-problem.html?start=1或等待TaskEx.Delay或Await async澄清 。 我用 Task DoWork() { return Task.Run(() => { for (int i = 0; i < 30; i++) { Thread.Sleep(1000 * 60 * 30); } }); } 示例使用此 Task DoWork() { return TaskEx.Run(() => { for (int i = 0; i < 10; i++) { Thread.Sleep(500); } } }); 我称之为await DoWork(); […]

我被异步/等待宠坏了! 现在正在努力与明确的任务延续

编辑(接受后) 它可能不会立即显现,但@Servy的答案是正确的,而不需要在monodroid下自定义实现Unwrap – 在我的评论中我说它不存在,但它确实存在。 结束编辑 我正在编写一堆使用我们的RESTful Web服务的应用程序,尽管我认为我知道如何正确使用任务但事实并非如此。 场景是我已经为Windows Store实现了代码 – 使用async/await我需要为MonoDroid实现几乎相同的东西 – 没有那个(没有我不想使用的构建攻击)。 我已经将这个问题的问题归结为一组简单的异步获取整数的任务,然后,在继续中,触发另一个异步任务,转换从该整数构建的字符串。 在C#5中,这将是: 注意 – 当然我在这里使用Task.FromResult代替实际的异步代码 private async Task GetStringAsync() { return await GetStringFromIntAsync(await GetIntAsync()); } private async Task GetIntAsync() { return await Task.FromResult(10); } private async Task GetStringFromIntAsync(int value) { return await Task.FromResult(value.ToString()); } 要将此转换为基于延续的模式,我试过这个: private Task GetStringAsync() { //error on this […]

ASP.NET MVC(异步)CurrentCulture不在Controller和View之间共享

我有一个针对.NET Framework 4.7.1的ASP.NET MVC 4应用程序,如果操作包含异步调用,则存在Controller和View之间不共享文化的问题。 我正在引用NuGet包Microsoft.AspNet.Mvc 5.2.3(可以在5.2.4中复制)。 这是Controller中的代码: public class CulturesTestController : Controller { public async Task Index(string value) { Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(“fi-FI”); Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(“fi-FI”); var model = new CulturesContainer { CurrentCulture = Thread.CurrentThread.CurrentCulture, CurrentUICulture = Thread.CurrentThread.CurrentUICulture, CurrentThreadId = Thread.CurrentThread.ManagedThreadId }; Log.Write(Level.Info, “CurrentUICulture – Before Await – ” + “CurrentCulture: ” + $”{Thread.CurrentThread.CurrentCulture}, ” […]

在void方法中使用async await

我有签名的方法我无法改变。 它应该是 protected override void OnInitialize() 使用Windows 8 Metro API我需要检查文件是否存在并在此NoSignatureChange方法中读取它。 使用PlainOldCSharp,我会写类似的东西 protected override void OnInitialize() { … try { var file = folder.OpenFile(fileName); fileExists=true; } catch(FileNotFoundException) { fileExists=false } } 请记住,在Windows 8 API中只检查文件是否存在正在处理FileNotFoundException此外,在Windows 8 API中所有FileIO API都是异步的,所以我只有file.OpenFileAsync方法。 所以,问题是: 如何使用Windows 8 API中的folder.OpenFileAsync方法编写此代码而不更改包含方法的签名

使用async / await设置Thread.CurrentPrincipal

下面是我试图在异步方法中将Thread.CurrentPrincipal设置为自定义UserPrincipal对象的简化版本,但是自定义对象在离开await后会丢失,即使它仍然在新的threadID 10上。 有没有办法在await中更改Thread.CurrentPrincipal并在以后使用它而不传入或返回它? 或者这不安全,永远不应该是异步的? 我知道有线程更改,但认为async / await将为我处理同步。 [TestMethod] public async Task AsyncTest() { var principalType = Thread.CurrentPrincipal.GetType().Name; // principalType = WindowsPrincipal // Thread.CurrentThread.ManagedThreadId = 11 await Task.Run(() => { // Tried putting await Task.Yield() here but didn’t help Thread.CurrentPrincipal = new UserPrincipal(Thread.CurrentPrincipal.Identity); principalType = Thread.CurrentPrincipal.GetType().Name; // principalType = UserPrincipal // Thread.CurrentThread.ManagedThreadId = 10 }); principalType […]

SendMailAsync:在异步操作仍处于挂起状态时完成的异步模块或处理程序

使用SendMailAsync我收到以下错误: 在异步操作仍处于挂起状态时完成异步模块或处理程序 我的代码: public static async Task SendEmail(MessageContent messageContent, string emailBody) { SmtpClient smtpClientNoSend = new SmtpClient(); await smtpClientNoSend.SendMailAsync(mailMessage); } 从控制器呼叫: public async System.Threading.Tasks.Task Register() { await SendEmail(); } private void SendEmail() { SMTPEmail.SendEmail(msg, output.ToString()); return null; }

Task.WhenAny – 剩余的正在运行的任务会发生什么?

我有以下代码: List<Task> tasks = tasksQuery.ToList(); while (tasks.Any()) { Task completedTask = await Task.WhenAny(tasks); if (await completedTask) return true; tasks.Remove(completedTask); } 它并行启动任务。 当第一个完成的任务返回true时,方法返回true。 我的问题是: 所有剩余的任务已经启动并且可能仍在后台运行会发生什么? 这是执行异步,并行和在第一个条件发生后应该返回的代码的正确方法,还是最好逐个启动它们并等待它们? 谢谢

异步/等待和缓存

我的服务层正在缓存很多对memcached的Db请求,这是否使得无法使用Async / Await? 例如,我怎么能等待这个? public virtual Store GetStoreByUsername(string username) { return _cacheManager.Get(string.Format(“Cache_Key_{0}”, username), () => { return _storeRepository.GetSingle(x => x.UserName == username); }); } 注意:如果密钥存在于缓存中,它将返回“Store”(而不是Task ),如果缓存中不存在该密钥,则它将执行lambda。 如果我将Func更改为 return await _storeRepository.GetSingleAsync(x => x.UserName == username); 并且方法签名为 public virtual async Task GetStoreByUsername(string username) 由于缓存返回类型,这显然不起作用。

CPU未得到充分利用。 由于阻塞I / O?

我试图找到C#服务器应用程序瓶颈未充分利用的地方。 我认为这可能是由于磁盘I / O性能不佳而与应用程序本身无关,但我无法从这个假设中得出一个事实。 应用程序从本地MSMQ队列中读取消息,对每条消息进行一些处理,并在处理完消息后,将响应消息发送到另一个本地MSMQ队列。 我正在使用异步循环从队列中读取消息,尽可能快地将它们出列并使用Task.Run调度它们进行处理以启动每个消息的处理(并且不要等待此Task.Run …只是附加一个延续只记错了记录错误)。 每个消息被同时处理,即在处理下一个消息之前不需要等待消息被完全处理。 在处理消息的最后,我使用MessageQueue的Send方法(不知何故异步但不是真的因为它必须等待磁盘写入才能返回-see System.Messaging – 为什么MessageQueue不提供异步版本的Send )。 对于基准测试,我在队列中排队100K消息(100K消息的总大小约为100MB)然后我启动程序。 在我的两台个人计算机上(一台SSD HD和另一台SATA2 HD,i7 CPU四核-8逻辑处理器) – 我在程序生命周期内达到~95%的CPU使用率(将100K消息出列,处理它们和发送回复)。 消息尽可能快地出列,尽可能快地处理(这里涉及的CPU),然后对发送到不同本地队列的每个消息进行响应。 现在在一个运行非HT双核CPU的虚拟机上(不知道什么是底层磁盘,但看起来远不如地雷……在基准测试期间,使用Perfmon我可以看到avg disk sec / write arround 10-15 ms on this VM,虽然我的个人机器上是2ms左右)当我运行相同的工作台时,我只能达到~55%的CPU(当我在机器上运行相同的工作台时没有向队列发送响应消息我达到~90%CPU )。 我真的不明白这里有什么问题。 似乎很清楚,向队列发送消息是问题并且减慢了程序的全局处理(以及要处理的消息的队列化),但为什么会考虑我使用Task.Run来启动每个出列消息的处理并最终响应发送,我不希望CPU未被充分利用。 除非一个线程正在发送消息时阻止其他线程在等待返回(磁盘写入)时在同一个核心上运行,在这种情况下,考虑到延迟远远高于我的个人计算机,它可能是有意义的,但是一个线程等待I / O不应该阻止其他线程运行。 我真的想了解为什么我没有达到这台机器至少95%的CPU使用率。 我盲目地说这是由于较差的磁盘I / O性能,但我仍然不明白为什么它会导致CPU利用不足,因为我正在使用Task.Run同时运行处理。 它也可能是一些与磁盘完全无关的系统问题,但考虑到MessageQueue.Send似乎是问题,并且此方法最终将消息写入内存映射文件+磁盘,我看不出性能问题可能来自何处除了磁盘。 当然,由于程序最大限度地提高了我自己计算机上的CPU使用率,因此确实存在系统性能问题,但我需要找到VM系统上的瓶颈,以及为什么它会影响我的应用程序的并发/速度。 任何的想法 ?