Tag: async await

async / await上的MSDN示例 – 在await调用之后我不能到达断点吗?

在async / await上尝试MSDN的例子时,为什么我在await运算符之后无法达到断点? private static void Main(string[] args) { AccessTheWebAsync(); } private async Task AccessTheWebAsync() { // You need to add a reference to System.Net.Http to declare client. HttpClient client = new HttpClient(); // GetStringAsync returns a Task. That means that when you await the // task you’ll get a string (urlContents). Task getStringTask = […]

C#中的循环异步任务列表

我试图不断地从几个网站解析数据。 我希望以异步方式在循环中单独执行此操作,直到程序关闭。 我不确定这种逻辑应该是什么结构。 现在我正在遵循这种模式。 async public void ParseAll(List SiteList) { List TaskList = new List(); foreach(Site s in SiteList) { TaskList.Add(s.ParseData); } await Task.WhenAll(TaskList) } 问题是,如果我围绕此方法构造一个循环,那么首先更新的站点必须等到整个列表完成才能再次运行该方法。 从理论上讲,我想做的就是在完成ParseData方法时将每个站点放回到TaskList的底部,但我不确定这是否可行,或者这是否是最好的方法。

在Ui线程上执行同步操作

我正在尝试开发Windows应用程序并遇到问题。 我有一个MainPage.xaml和另外两个StartScreen.xaml和Player.xaml。 如果某些条件为真,我正在切换MainPage的内容。 所以我在StartScreen中有一个事件,它检查目录是否存在,但每次出错时它都会抛出我。 private void GoToPlayer_Click(object sender, RoutedEventArgs e) { if (Directory.Exists(this.main.workingDir + “/” + IDText.Text + “/Tracks”)) // Error occurs here { this.main.Content = this.main.player; //here i switch between different ui forms } else { MessageBox.Text = “CD not found”; IDText.Text = “”; } } 当它到达else分支时一切都很好但是当dir可用时我收到以下错误消息: An exception of type ‘System.InvalidOperationException’ occurred in […]

AsyncCTP:创建一个IAwaitable类

我发现自己想要实现一个IAwaitable类(在不阻塞线程的情况下实现异步调用)。 我安装了最新版本的AsyncCTP,编译器说我需要一个IsCompleted()成员。 好的,所以CTP预览已经移动了一点(我明白了,就像预览一样) 问题:AsyncCTP语言扩展现在期待什么接口? 问题:在这一切中,我假设我可以通过lamda / delegate向“IAwaitable”发出信号? 这可能吗? 我们称之为EndAwait吗? intellisense建议你调用EndAwait来检索结果……这听起来不对。 有任何想法吗? 到目前为止,我发现的所有示例都是针对AsyncCTP库已经实现的function,例如: await new WebClient().DownloadStringTaskAsync(uri).ConfigureAwait(false); 来自101 AsyncSamplesCS 背景: 我发现自己在Jon Skeets页面上(再次)看着这个例子 using System; class Test { static async void Main() { await new Awaitable(); } } class Awaitable { public Awaiter GetAwaiter() { return new Awaiter(); } } class Awaiter { public bool BeginAwait(Action continuation) { […]

Xamarin.Forms – BeginInvokeOnMainThread用于异步操作

我熟悉使用Device.BeginInvokeOnMainThread更新UI线程上的UI元素的规则,但是我有一个需要在实际上是Task的UI线程上运行的操作。 例如,XLabs.Forms.Mvvm上的Push / PopAsync方法似乎在iOS上表现不正确,除非在UI线程上调用它们。 Acr.UserDialogs库中还有另一个用于显示toasts等的示例。 我知道创建一个Action异步基本上是创建一个异步void lambda,并且在exception的情况下冒着创建死锁的风险,显然我不希望这种情况发生。 有没有人在UI线程上执行异步操作的解决方法,不涉及将Action标记为异步?

我如何使用方法async Task 并返回字符串,然后如何将该方法的委托传递给构造函数并在以后使用它?

我有这个返回string方法: public string SendResponse(HttpListenerRequest request) { string result = “”; string key = request.QueryString.GetKey(0); if (key == “cmd”) { if (request.QueryString[0] == “uploadstatus”) { switch (Youtube_Uploader.uploadstatus) { case “uploading file”: return “uploading ” + Youtube_Uploader.fileuploadpercentages; case “status”: return Youtube_Uploader.fileuploadpercentages.ToString(); case “file uploaded successfully”: Youtube_Uploader.uploadstatus = “”; return “upload completed,” + Youtube_Uploader.fileuploadpercentages + “,” + Youtube_Uploader.time; […]

如何解释await / async同步上下文切换行为

有几件事(但主要的一点)我不明白以下代码的行为。 有人可以帮忙解释一下吗? 它实际上是非常简单的代码 – 只是一个调用异步方法的常规方法。 在异步方法中,我使用using块尝试临时更改SynchronizationContext。 在代码的不同点,我探测当前的SynchronizationContext。 这是我的问题: 当执行到达位置“2.1”时,上下文已变为上下文#2。 好的。 然后,因为我们点击`await`,返回一个Task并执行跳回到位置“1.2”。 为什么那么,在位置1.2,上下文不会“粘”在上下文#2? 也许使用using语句和异步方法会有一些魔力吗? 在2.2位,为什么上下文不是Context#2? 上下文是否应该转入“延续”(“等待”之后的陈述)? 码: public class Test { public void StartHere() { SynchronizationContext.SetSynchronizationContext(new SynchronizationContext()); this.logCurrentSyncContext(“1.1”); // Context #1 Task t = f(); this.logCurrentSyncContext(“1.2”); // Context #1, why not Context #2? t.Wait(); this.logCurrentSyncContext(“1.3”); // Context #1 } private async Task f() { using (new […]

是否有“单项大小的异步任务缓冲区”这样的同步工具?

很多时候在UI开发中我处理事件的方式是当事件第一次出现时 – 我立即开始处理,但如果有一个处理操作正在进行中 – 我等待它完成,然后再处理另一个事件。 如果在操作完成之前发生多个事件 – 我只处理最近的事件。 我通常这样做的方式我的进程方法有一个循环,在我的事件处理程序中,我检查一个字段,指示我当前是否正在处理某些事情,如果我 – 我把我当前的事件参数放在另一个基本上是一个项目大小的字段中缓冲区和当前处理过程完成时 – 我检查是否有其他事件要处理,我循环直到我完成。 现在这似乎有点过于重复,可能不是最优雅的方式,虽然它似乎对我来说工作正常。 那我有两个问题: 我需要做的是否有名字? 是否有一些可重复使用的同步类型可以为我做到这一点? 我正在考虑在我的工具包中添加一些由Stephen Toub提供的异步协调原语。

用于处理c#中文件的multithreading任务

我一直在阅读很多关于线程的内容,但无法弄清楚如何找到我的问题的解决方案。 首先让我介绍一下这个问题。 我有需要处理的文件。 主机名和文件路径位于两个arrays中。 现在我想设置几个线程来处理文件。 要创建的线程数基于三个因素: A)最大线程数不能超过所有方案中唯一主机名的数量。 B) 必须按顺序处理具有相同主机名的文件。 IE我们无法同时处理host1 _file1和host1 _file2。 (数据完整性将受到威胁,这超出了我的控制范围。 C)用户可以限制可用于处理的线程数。 线程数仍受上述条件A的限制。 这纯粹是因为如果我们有大量的主机让我们说50 ..我们可能不希望同时处理50个线程。 在上面的示例中,最多可以创建6个线程。 最佳处理程序如下所示。 public class file_prep_obj { public string[] file_paths; public string[] hostname; public Dictionary my_dictionary; public void get_files() { hostname = new string[]{ “host1”, “host1”, “host1”, “host2”, “host2”, “host3”, “host4″,”host4″,”host5″,”host6” }; file_paths=new string[]{“C:\\host1_file1″,”C:\\host1_file2″,”C:\\host1_file3″,”C:\\host2_file1″,”C:\\host2_file2″,”C:\\host2_file2”, “C:\\host3_file1″,”C:\\host4_file1″,”C:\\host4_file2″,”C:\\host5_file1″,”C:\\host6_file1”}; //The dictionary provides a […]

async一直向下问题

我有一个异步asp.net控制器。 该控制器调用异步方法。 实际执行异步IO工作的方法深入到我的应用程序中。 控制器和链中最后一个方法之间的一系列方法都用async修饰符标记。 以下是我如何设置代码的示例: public async Task Index(int[] ids) { List listOfDataPoints = dataPointService(ids); List dpTaskList = new List(); foreach (var x in listOfDataPoints) { dpTaskList.Add(C_Async(x)); } await Task.WhenAll(dpTaskList); return View(); } private async Task C_Async(int id) { //this method executes very fast var idTemp = paddID(id); await D_Async(idTemp); } private async Task D_Async(string […]