Tag: asynchronous

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的底部,但我不确定这是否可行,或者这是否是最好的方法。

在C#插件中调用Dynamics Web API

我在Microsoft Dynamics中有一个业务流程来处理新客户端的创建。 当流程结束时,我附加了一个工作流程,该工作流程可以调用插件来执行某些自定义处理。 我正在按照这篇文章来设置这个过程。 在我的插件中,我调用了Dynamics Web API(请参阅下面的代码)。 当我点击responseMessage = client.GetAsync(url).Result; line,我的插件退出而不返回错误。 当我在插件注册工具中调试时,插件注册工具崩溃并且必须重新启动。 当我查看网络流量时,此呼叫似乎失败了401 – Unauthorized错误。 当我从控制台应用程序尝试同样的HttpClient调用时,调用成功。 我已经尝试了一些不同的凭据进行身份validation而没有成功。 我也尝试过几种不同的方式调用GetAsync函数。 此错误与异步或身份validation方法有关吗? 我在这里想念的是什么? HttpClient client = new HttpClient(new HttpClientHandler() { Credentials = new NetworkCredential(“admin”, “password”, “DOMAIN”) }); client.BaseAddress = new Uri(Helpers.GetSystemUrl(COHEN.APIConnector.Application.Dynamics)); client.DefaultRequestHeaders.Clear(); client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(“application/json”)); client.DefaultRequestHeaders.Add(“OData-MaxVersion”, “4.0”); client.DefaultRequestHeaders.Add(“OData-Version”, “4.0”); HttpResponseMessage responseMessage; string url = “ccseq_clients”; responseMessage = client.GetAsync(url).Result; 更新 […]

为什么async / await在我的ASP.net 5控制台应用程序中不起作用?

我在Windows(.NET 4.5.1)和Linux(Mono 4.0.1)上尝试了这个简单的ASP.net 5控制台应用程序,两次都有相同的结果。 注意:我称之为ASP.net 5控制台应用程序,因为这是在Visual Studio中调用到RC的内容。 现在它被称为控制台应用程序(包),但它仍然使用来自https://github.com/aspnet/dnx的 DNX 🙂 我的Program.cs : using System; using System.Threading.Tasks; namespace ConsoleApplication { public class Program { public async void Main(String[] args) { #if DNX451 AppDomain.CurrentDomain.UnhandledException += (s, e) => Console.WriteLine(e); #endif try { await Task.Delay(1000); Console.WriteLine(“After Task.Delay”); } finally { Console.WriteLine(“Inside Finally”); } } } } 我的project.json : […]

如果我在IQueryable上使用等待+ ToListAsync()并且未定义为任务,那么它是否正确

我正在使用带有EF-6的asp.net MVC-5,我不确定使用await + ToListAsync是否有效。 例如,我有以下存储库方法,它返回IQueryable: – public IQueryable getAllScanEmailTo() { return t.TSets.Where(a=>a.Name.StartsWith(“ScanEmail”)); } 我称之为: – var emailsTo = await repository.getAllScanEmailTo().ToListAsync(); 一开始,我以为我会得到一个错误,因为我正在使用“等待”一个未被定义为任务的方法,但上面工作得很好,所以有人可以就此提出建议吗?

在单个控制台行上处理输出重定向

我正在编写一个C#应用程序,它可以启动第三方命令行可执行文件并将其标准输出重定向到RichTextBox。 我可以使用process.OutputDataReceived事件重定向输出。 我有一个我推送行的队列,然后我使用一个计时器定期将所有排队的行转储到RichTextBox中。 这适用于某些第三方程序。 问题在于多次向控制台的单行写入的程序。 例如:5% – > 10% – > 25%等…(不断重写相同的位置)我想,这是通过不放置换行符来完成的,而是简单地返回到行的开头回车并写回以前的字符。 会发生什么是OutputDataReceived似乎没有任何方式来指示是否应该应用新行,所以我的RichTextBox输出只是在新行上有多个更新。 例如:5%10%25%等… 有没有办法判断标准输出是在新线还是在同一条线上?

为什么我的异步代码在调试时同步运行?

我正在尝试使用异步function实现一个名为ReadAllLinesAsync的方法。 我已经生成了以下代码: private static async Task<IEnumerable> FileReadAllLinesAsync(string path) { using (var reader = new StreamReader(path)) { while ((await reader.ReadLineAsync()) != null) { } } return null; } private static void Main() { Button buttonLoad = new Button { Text = “Load File” }; buttonLoad.Click += async delegate { await FileReadAllLinesAsync(“test.txt”); //100mb file! MessageBox.Show(“Complete!”); }; Form […]

我怎么能强制等待继续在同一个线程?

await不保证在生成任务的同一任务上继续: private void TestButton_Click(object sender, RoutedEventArgs e) { Task.Run(async () => { Debug.WriteLine(“running on task ” + Task.CurrentId); await Task.Delay(TimeSpan.FromMilliseconds(100)); Debug.WriteLine(“running on task ” + Task.CurrentId); }); } 这个输出是: running on task 1 running on task 所以我们可以看到,不仅执行已经移动到另一个任务,而且还移动到UI线程。 如何创建专用任务,并强制等待始终继续执行此任务? 长时间运行的任务也不会这样做。 我已经看过几个SynchronizationContext实现 ,但到目前为止它们都没有工作,在这种情况下因为它使用线程而System.Threading.Thread不适用于uwp。

如何限制多个异步任务?

我有一些以下forms的代码: static async Task DoSomething(int n) { … } static void RunThreads(int totalThreads, int throttle) { var tasks = new List(); for (var n = 0; n < totalThreads; n++) { var task = DoSomething(n); tasks.Add(task); } Task.WhenAll(tasks).Wait(); // all threads must complete } 麻烦的是,如果我没有限制线程,事情开始崩溃。 现在,我想启动最多的throttle线程,并且只在旧线程完成时启动新线程。 我尝试过几种方法,迄今为止没有一种方法可行。 我遇到的问题包括: tasks集合必须完全填充所有任务,无论是活动还是等待执行,否则最终的.Wait()调用只会查看它所启动的线程。 链接执行似乎需要使用Task.Run()等。 但是我需要从一开始就引用每个任务,并且实例化任务似乎会自动启动它,这是我不想要的。 这该怎么做?

等待事件处理程序的异步

我很困惑如何最好地处理这种情况。 我不想等待异步调用的响应。 具体来说,我有: public async Task FetchQueuedApiAsync(TimeSpan receiveTimeout) { var message = await Task.Factory.FromAsync( ReadQueue.BeginReceive(receiveTimeout), ReadQueue.EndReceive); return message.Body as IApiData; } 这按预期工作。 但是,如果超时到期,则不得调用ReadQueue.EndReceive,否则将引发exception。 显然,FromAsync并不知道这一点并盲目地调用它 – 解雇exception。 不要在超时时调用EndReceive的要求由MSMQ实现,超出了我的控制范围。 当消息准备就绪或发生超时时,队列会公开事件。 这是您通常检查消息是否存在的位置,然后根据文档调用EndReceive。 标准听众…. ReadQueue.ReceiveCompleted += ReadQueue_ReceiveCompleted; 我的问题是,我不明白该怎么做,仍然有这个等待(即我希望能够等待我现在,但通过委托处理它)。 那有意义吗?

如何编写C#5异步?

我有以下情况: 当输入命令时(为了测试,它是一个控制台应用程序,当它准备就绪时,我希望它将是一个WebService)我执行一些代码,当需要进一步的用户输入时,我立即返回命令解释器。 当给出新输入时,我希望处理从我离开它的地方继续。 这听起来很像c#5 async-await模式,我决定尝试一下。 我在想这个: public void CommandParser() { while(true) { string s = Console.ReadLine(); if (s == “do_something”) Execute(); else if (s == “give_parameters”) SetParameters(); //… } } MySettings input; public async void Execute() { //do stuff here MyResult result = null if (/*input needed*/){ input = new MySetting(); result = await input.Calculate(); […]