Tag: async await

每次调用异步void方法时都会创建一个新线程吗?

我有以下情况: async void DoStuff() { // … } button1.Click += (s, p) => { DoStuff(); }; 我不确定在第一次调用仍未完成时调用async void方法时会发生什么。 调用每次调用时都会创建一个新线程,还是调用会破坏并覆盖之前创建的线程? 此外,如果前一个假设是正确的,那么本地方法变量是否会被共享? 编辑: 我误解了async await事情,因为在Windows 8应用程序中,它的行为有所不同。 如果您认为调用异步方法与创建像我这样的新线程相同,请阅读此澄清文章 。

使用TaskCompletionSource作为WaitHandle替代品是否可以接受?

我的代码处理与远程主机的TCP连接,使用ConcurrentQueue存储传出消息。 它打算在单个线程中运行。 连接的生命周期包含在RunAsync而单独的对象包含连接的“公共状态”: class PublicState { internal readonly ConcurrentQueue OutgoingMessageQueue = new ConcurrentQueue(); internal TaskCompletionSource OutgoingMessageTcs = null; internal readonly TaskCompletionSource ConnectedTcs = new TaskCompletionSource(); public void EnqueueMessages(IEnumerable messages) { foreach( Message m in messages ) this.OutgoingMessageQueue.Enqueue( m); if( this.OutgoingMessageTcs == null ) this.OutgoingMessageTcs = new TaskCompletionSource(); this.OutgoingMessageTcs.SetResult( null ); } } static async Task […]

如果有条件地执行任务,异步方法应该怎么做?

假设我有一个等待任务的方法。 此方法还返回一个Task。 例如: public async virtual Task Save(String path) { if (NewWords.Any()) { await FileManager.WriteDictionary(path, NewWords, true); } else await Task.Run(() => { }); } 是个 else await Task.Run(() => { }); 这里有必要还是我可以自由离开? 如果它存在/不存在有什么区别吗? 也许我应该采取其他一些方法吗?

等待异步方法在结果需要之前不返回

我无法解决我遇到异步/等待的问题。 简而言之,我有一个控制器,装饰有属性。 此属性从i / o密集型进程(filesystem / db / api等…)获取指定的内容 然后,它将返回的内容设置为ViewBag上的Dictionary 然后,在视图中,我可以做这样的事情,以检索内容: @(ViewBag.SystemContent[“Common/Footer”]) 我遇到的问题是,它第一次运行时,内容没有返回,并且通过字符串索引检索值的调用失败,因为它不存在。 点击F5,没关系。 控制器动作非常简单: [ProvideContent(“Common/Footer”)] public class ContactDetailsController : Controller { public async Task Index() { //omitted for brevity – awaits some other async methods return View(); } } 属性 public override async void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.Result is ViewResult) { var localPath […]

ServiceStack“新”api和async等待

ServiceStack版本3 我非常熟悉https://github.com/ServiceStack/ServiceStack/wiki/New-API ,在这个页面上它特别说“所有这些API都有异步等价物,你可以在需要时使用它们。” 是否可以使用async等待ServiceStack的新api? 使用异步等待服务器和客户端代码会是什么样的? [Route(“/reqstars”)] public class AllReqstars : IReturn<List> { } public class ReqstarsService : Service { public List Any(AllReqstars request) { return Db.Select(); } } 客户 var client = new JsonServiceClient(BaseUri); List response = client.Get(new AllReqstars()); 有些人请将这些同步示例转换为异步吗?

如何使“旧式”异步方法等待

如果我有一个带回调的异步方法 MyMethodAsync( , Callback); 我怎么能让它等待? [此方法适用于Windows Phone 7,但应同样适用于任何类似的c#构造] DNSEndpoint Endpoint = … NameResolutionCallback Callback = (nrr) => { … } DeviceNetworkInformation.ResolveHostNameAsync(Enpoint, Callback, null); 我想在这个调用周围放置一个等待的包装器,所以我等待回调完成后再继续下一个命令。

如何阻止HttpClient.GetAsync(uri)挂起?

我有以下代码用于调用uri: var uri = string.Format(“Helpers/ProfileList/Online/?locationId=0&skip=0&take={0}”, numProfiles); HttpResponseMessage response = await client.GetAsync(uri); response.EnsureSuccessStatusCode(); uri指向一个自定义的web api uri(我可以调试并完成)。 但是,当调用api中的最后一个return语句时,似乎什么也没发生。 它应该转到response.EnsureSuccessStatusCode(); 线,但事实并非如此。 它似乎挂了。

使用async await仍会冻结GUI

我想在单独的线程中处理长时间运行的操作,并使用async / await模式将控制返回到GUI线程,如下所示: private async void Button_Click(object sender, RoutedEventArgs e) { await Test(); txtResult.Text = “Done!”; } private Task Test() { Thread.Sleep(3000); return Task.FromResult(0); } 问题是,它无论如何都会冻结GUI 3秒钟(在3秒后显示Done!之前它会变得无法响应)。 我究竟做错了什么? 编辑:我试图取代以下逻辑: private void Button_Click(object sender, RoutedEventArgs e) { var thread = new Thread(() => Test(Callback)); thread.Start(); } private void Callback() { Dispatcher.Invoke(() => txtResult.Text = “Done!”); } […]

使用async / await执行并行任务

我需要在Silverlight中执行多个异步任务。 我可以使用的第三方包状态的文档 await Task.WhenAll() 不幸的是,silverlight只有Task.WaitAll()并且它不值得等待。 如果我尝试使用它我会陷入僵局(我假设 – 因为整个事情都冻结了) 在异步方法中使用的正确模式是什么?

以下代码是否捕获了TPL中原始,继续和子任务的exception?

我正在使用TPL和async / await在我的应用程序的webclient上构建异步API。 很少有地方(通常我需要运行一堆异步任务并最终等待所有这些),我正在关注代码片段。 我只是想确保我正确,因为即使使用TPL编写异步代码相对容易并且async / await 调试/故障排除仍然具有挑战性 (在客户站点上的交互式调试和故障排除问题) – 所以想要正确。 我的目标:能够捕获原始任务,继续任务以及子任务生成的exception,以便我可以处理它(如果需要)。 我不希望任何例外是冷杉和遗忘。 我使用的基本原理: 1.net框架确保将exception附加到任务2.可以将try / catch块应用于async / await以提供同步代码的幻觉/可读性(参考: http://channel9.msdn。 com / Events / TechDays / Techdays-2014-the-Netherlands / Async-programming-deep-dive , http://blogs.msdn.com/b/ericlippert/archive/2010/11/19/asynchrony-in-c- 5-part-seven-exceptions.aspx , http://msdn.microsoft.com/en-us/library/dd537614.aspx等) 问题我想获得批准,我们已经实现了期望的目标(我可以从原始,继续和子任务中捕获exception),并且我可以对样本做任何改进: 例如,是否存在其中一个组合任务(例如,未解包的代理任务)根本不会被激活(waitforactivation状态)的情况,那么waitall可能只是等待任务开始? 我的理解是这些情况永远不会发生,因为延续任务总是执行,并返回由代理使用wnwrap跟踪的任务。 只要我在所有层和apis中遵循类似的模式,模式就应该捕获链接任务中的所有聚合exception。 注意:基本上我正在寻找建议,例如,如果原始任务状态没有运行完成,或者使用附加到父级,那么在继续任务中创建虚拟任务是创建的,这样我只能在父级等上等待才能看到所有可能性以便我可以选择最好的选择,因为这个模式在我的应用程序中严重依赖于error handling。 static void SyncAPIMethod(string[] args) { try { List composedTasks = new List(); //the underlying async […]