Tag: asynchronous

C#Concurrency – 长期运行任务的首选方法

当需要在整个应用程序生命周期中运行I / O侦听器时,在4.5框架上运行C#5.0时,首选哪种并发模型? 我已经确定了生产者 – 消费者模式最适合处理我收到的内容,但基础设施应该支持它的想法? 是否建议使用简单的Thread thread = new Thread(ThreadStart(method)) ? 或者首选的是Task或Async/Await模型? 这是一个快速解决问题,但由于我在设计初期,我更愿意确保基础强大。 我对其他语言的直觉反应是,在后台运行一个简单的线程是最好的,但C#中过多的并行框架让我偏离了正轨。 如果有任何相关性,我的应用程序中的轮询时间将由I / O读取超时处理。 更新: I / OI指的是FTDI设备,其中字节可以随时由设备推送到PC,具体取决于板载控制器的状态。 因此,我总是需要准备好拾取数据并进行处理。 我正在使用的API基于FTDI供应商提供的D2XX DLL。

如何序列化async / await?

让我们假设我有这个简单的片段: async void button_Click(object sender, RoutedEventArgs e) { await Task.Factory.StartNew(() => { Console.WriteLine(“start”); Thread.Sleep(5000); Console.WriteLine(“end”); }); } 显然,每次按下该按钮,即使前一个任务仍在运行,也会启动一个新任务。 在所有先前的任务完成之前,我将如何推迟任何新任务? 更多细节: 在上面的示例中,每个新任务都与之前的任务相同。 但是,在原始上下文中,任务序列很重要:参数可能会发生变化(我可以通过使用DateTime.Now.Ticks来“模拟”它)。 任务应按照“注册”的顺序执行。 具体来说,我的程序将与串行设备通信。 我之前使用BlockingCollection的后台线程完成了这个。 但是,这次有一个严格的请求/响应协议,如果有可能,我想使用async / await。 可能的方法: 我可以想象创建任务并将它们存储在列表中。 但是,我如何执行与要求相关的任务? 或者我应该回到之前使用的基于线程的解决方案?

将MVC迷你探查器时序转换为异步任务

我在一个页面中运行了一个长时间的SQL查询,我通过使用异步任务来加速: using System.Threading.Tasks; … var asyncTask = new Task( () => { using (var stepAsync = MiniProfiler.Current.Step(“Async!”)) { // exec long running SQL } }); asyncTask.Start(); // do lots of other slow stuff ResultClass result; using (var stepWait = MiniProfiler.Current.Step(“Wait for Async”)) { result = asyncTask.Result; } (注意,一旦C#5出现async并await ,这种语法会更好) 当使用MVC迷你探查器时,我得到了“等待异步”的时间,但我无法得到“异步!”的时间。 步。 有没有办法将这些结果(可能只是SQL时序)放入已完成页面的跟踪中? 更新 我找到了一种方法来让探查器步骤进入异步方法: var […]

与EntityFramework 6的SqlDependency(异步)

我正在使用EF 6 async查询function,例如 var list = await cx.Clients.Where(c => c.FirstName.Length > 0).ToListAsync(); 我还想在这些查询上启动SQL依赖项,以便在数据库中的数据发生更改时收到通知。 我可以使用System.Runtime.Remoting.Messaging.CallContext执行此操作,如下所示: async Task GetData() { using (ClientsContext context = new ClientsContext()) // subclass of DbContext { SqlDependency.Start(context.Database.Connection.ConnectionString); SqlDependency dependency = new SqlDependency(); dependency.OnChange += (sender, e) => { Console.Write(e.ToString()); }; System.Runtime.Remoting.Messaging.CallContext.SetData(“MS.SqlDependencyCookie”, dependency.Id); var list = await context.Clients.Where(c => c.FirstName.Length > 0).ToListAsync(); } […]

aync与异步方法中的Task.Result

执行以下操作之间的区别是什么: async Task method(){ var r = await dynamodb.GetItemAsync(…) return r.Item; } VS async Task method(){ var task = dynamodb.GetItemAsync(…) return task.Result.Item; } 在我的情况下由于某种原因只有第二个工作。 第一个似乎永远不会结束。

HttpClient(C#)在许多异步请求上失败了吗?

我正在使用HttpClient异步向外部api发出许多请求。 我等待所有请求完成,然后在其他代码中使用响应。 我的问题是,如果我发出太多请求,当我使用Task.WhenAll等待时,我的代码会引发exception。 这段代码最终将并行运行,我的意思是我将同时执行多组这些异步请求(即10组200个异步请求)。 我已经实例化了一个HttpClient,我正在使用.NET 4.5异步/等待修饰符,如下所示: using (var client = new HttpClient()) { // make a list of tasks List<Task> taskList; List replies; for (int i = 0; i < MAX_NUMBER_REQUESTS; i++) { taskList.Add(client.GetAsync(externalUri); } List responses = await Task.WhenAll(taskList); // read each response after they have returned foreach (var response in responses) { var […]

如何在.net 3.5中获得等效的Task ?

我有一些使用Task代码,它推迟了短时间内从串行读操作返回结果,如下所示: void ReturnResponseAfterAShortDelay() { if (delayedResponseCancellationTokenSource != null) delayedResponseCancellationTokenSource.Cancel(); // Cancel any pending operations and start a new one. delayedResponseCancellationTokenSource = new CancellationTokenSource(); log.InfoFormat(“Deferring response for {0} ms”, Settings.Default.TimeoutMs); Task.Delay(Properties.Settings.Default.TimeoutMs, delayedResponseCancellationTokenSource.Token) .ContinueWith((continuation) => ReturnWhateverHasArrived(), TaskContinuationOptions.NotOnCanceled) .Start(); } 此代码背后的想法是在没有新字符到达指定间隔时返回结果。 但是,由于我无法控制的因素,我必须使用.NET 3.5,这会阻止我使用Task ,因此我必须以某种方式重构此代码。 如何在不使用Task情况下实现相同的结果? 澄清 虽然我展示的具体代码恰好是一个定时延迟,但我的用法并不仅限于延迟。 可能还有其他情况我想立即启动一些“长时间运行”的轮询任务。 典型情况是I / O绑定操作,例如,定期查询连接到串行端口的设备,然后在满足某些条件时引发事件。

async /等待不同的线程ID

我最近正在阅读关于异步/等待的事情,我很惊讶我正在阅读的许多文章/post说明在使用异步等待时没有创建新线程( 示例 )。 我创建了一个简单的控制台应用程序来测试它 class Program { static void Main(string[] args) { Console.WriteLine(“Main: ” + Thread.CurrentThread.ManagedThreadId); MainAsync(args).Wait(); Console.WriteLine(“Main End: ” + Thread.CurrentThread.ManagedThreadId); Console.ReadKey(); } static async Task MainAsync(string[] args) { Console.WriteLine(“Main Async: ” + Thread.CurrentThread.ManagedThreadId); await thisIsAsync(); } private static async Task thisIsAsync() { Console.WriteLine(“thisIsAsyncStart: ” + Thread.CurrentThread.ManagedThreadId); await Task.Delay(1); Console.WriteLine(“thisIsAsyncEnd: ” + Thread.CurrentThread.ManagedThreadId); } […]

操作完成前MVC4 + async / await +返回响应

在我的MVC4应用程序中,我需要添加一个控制器来上传和处理大文件。 文件上传后,我需要立即启动该文件的异步处理并将响应返回给浏览器,而无需等待处理完成。 显然我可以手动启动一个新线程来处理文件,但是我想知道我是否可以使用.net 4.5引入的async / await机制来实现这个场景 为了测试这个概念,我尝试过这样的事情: public async Task Test() { TestAsync(); return View(“Test”); } public async void TestAsync() { await LongRunning(); } private Task LongRunning() { return Task.Factory.StartNew(() => Pause()); } private int Pause() { Thread.Sleep(10000); return 3; } 异步机制似乎一般工作:当我调试代码时,我点击“返回视图(”测试“);” 行“返回3”之前的行。 但是,浏览器仅在Pause方法完成后才会收到响应。 这看起来像常规异步控制器(具有Async和Completed方法的控制器)。 有没有办法在控制器中为我的场景使用async / await?

如何回答请求但继续在WebApi中处理代码

我想回答一个请求,但继续处理代码。 我试过类似的东西: [HttpPost] public async Task SendAsync(MyRequest sms) { await Task.Run(() => Process(sms)); //need to run in a separate thread var response = new MyRequest(sms) { Ack = true }; return Request.CreateResponse(HttpStatusCode.Created, response.ToString()); } private async void Process(MyRequest sms) { var validationResult = new MyRequestValidation(_p2pContext, _carrierService).Validate(sms); if (string.IsNullOrWhiteSpace(validationResult.Errors[0].PropertyName)) // Request not valid return; Message msg; […]