Tag: async await

ApiController Post中的Async和Await

我还不太清楚异步并等待.net 4.5。 到目前为止,我想我明白等待: 将函数(右侧)放在一个单独的线程上。 将执行放回当前函数的调用者 但保持当前函数的代码“hostage”的其余部分,直到等待(异步)函数完成。 如果我误解了什么,请纠正我。 所以,如果上面的描述是真的,我会遇到一个我想要异步的ApiController的Post函数: [HttpPost] public async Task Post([FromBody]MyObject obj) { myDataContext.MyObjects.InsertOnSubmit(obj); myDataContext.SubmitChanges(); await SomeReallyLongRunningTaskAsync(); // obj would now have the new Id, which I’m really after. return Request.CreateResponse(HttpStatusCode.Created, obj); } 因此,如果我正确理解这一点,Post将完成执行并将控制权返回给调用myApiController.Post(obj) 。 但是我没有HttpResponseMessage对象,因为等待保持return Request.CreateResponse(HttpStatusCode.Created, obj); “人质”。 在上面这个简单的例子中,调用会立即返回客户端(即客户端JS网站还是移动应用程序)? 如果是这样,它会是201,400,500(最好不是),其他人呢?

.net框架是否提供了使用文件系统的异步方法?

.net框架是否具有允许使用文件系统的async内置库/程序集(例如File.ReadAllBytes , File.WriteAllBytes )? 或者我是否必须使用StreamReader和StreamWriter的async方法编写自己的库? 像这样的东西会很不错: var bytes = await File.ReadAllBytes(“my-file.whatever”);

如何并行正确运行多个异步任务?

如果您需要并行运行多个异步I / O任务但需要确保不会同时运行多个XI / O进程,该怎么办? I / O处理前后的任务不应该有这样的限制。 这是一个场景 – 假设有1000个任务; 每个人都接受一个文本字符串作为输入参数; 转换该文本(预I / O处理)然后将转换后的文本写入文件。 目标是使预处理逻辑利用100%的CPU /内核和任务的I / O部分以最大10度的并行性运行(同时打开最多10个用于一次写入文件)。 你能提供一个示例代码如何使用C#/ .NET 4.5吗? http://blogs.msdn.com/b/csharpfaq/archive/2012/01/23/using-async-for-file-access-alan-berman.aspx

LogicalOperationStack与.Net 4.5中的异步不兼容

Trace.CorrelationManager.LogicalOperationStack允许嵌套逻辑操作标识符,其中最常见的情况是日志记录(NDC)。 是否仍然可以使用async-await ? 这是一个使用LogicalFlow的简单示例,它是我在LogicalOperationStack简单包装器: private static void Main() => OuterOperationAsync().GetAwaiter().GetResult(); private static async Task OuterOperationAsync() { Console.WriteLine(LogicalFlow.CurrentOperationId); using (LogicalFlow.StartScope()) { Console.WriteLine(“\t” + LogicalFlow.CurrentOperationId); await InnerOperationAsync(); Console.WriteLine(“\t” + LogicalFlow.CurrentOperationId); await InnerOperationAsync(); Console.WriteLine(“\t” + LogicalFlow.CurrentOperationId); } Console.WriteLine(LogicalFlow.CurrentOperationId); } private static async Task InnerOperationAsync() { using (LogicalFlow.StartScope()) { await Task.Delay(100); } } LogicalFlow : public static class LogicalFlow […]

在控制器中调用异步方法

我有一个控制器,如下所示: public MyController : Controller { public ActionResult DoSomething() { CallSomeMethodWhichDoesAsyncOperations(); return Json(new { success = successful }, JsonRequestBehavior.AllowGet); } } 调用我的控制器时,我收到以下错误: 此时无法启动异步操作。 异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。 如果在执行页面时发生此exception,请确保将页面标记为 。 现在我无法控制CallSomeMethodWhichDoesAsyncOperations ,并且方法本身不是异步的,但内部会执行一些异步触发并忘记。 我该怎么做才能解决它? 尝试将控制器更改为AsyncController和/或使控制器中的方法异步。 编辑: 当我第一次尝试使用AsyncController时,结果相同 public MyController : AsyncController { public ActionResult DoSomething() { CallSomeMethodWhichDoesAsyncOperations(); return Json(new { success = successful }, JsonRequestBehavior.AllowGet); } } 然后 public MyController […]

System.Threading.Tasks中的NullReferenceException调用HttpClient.GetAsync(url)

我的MVC 4.0应用程序中有一个奇怪的问题。 我使用REST Web服务(Amazon Associate)。 我创建了一个方法,我从各处使用它。 缩短版本是这样的: private async Task GetRequest(string url) { string myresponse; HttpResponseMessage response = null; HttpClient client = new HttpClient(); try { response = await client.GetAsync(url); myresponse = response.Content.ToString(); if (myresponse.Contains(“503”)) { myTrace.WriteLine(“503 Sleep…..”); Thread.Sleep(3000); // looks like amazon us does not like fast requests…. return await GetRequest(url); //restart after pausing…. […]

懒惰共享异步资源 – 澄清?

我在斯蒂芬的书末尾看到了这个例子。 此代码可以由多个线程访问。 static int _simpleValue; static readonly Lazy<Task> MySharedAsyncInteger = new Lazy<Task>( async () => { await Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false); return _simpleValue++; }); async Task GetSharedIntegerAsync() { int sharedValue = await MySharedAsyncInteger.Value; } 无论代码中有多少部分同时调用Value, Task只创建一次并返回给所有调用者。 但后来他说: 如果有不同的线程类型可以调用Value (例如,UI线程和线程池线程,或两个不同的ASP.NET请求线程),那么总是在线程池线程上执行异步委托可能会更好。 所以他建议使用以下代码,使整个代码在线程池线程中运行: static readonly Lazy<Task> MySharedAsyncInteger = new Lazy<Task>(() => Task.Run( async () => { await Task.Delay(TimeSpan.FromSeconds(2)); return _simpleValue++;; })); […]

C#具有异步函数调用同步函数或同步函数调用异步函数

我正在编写一个C#.Net 4.5库,用于执行常见的sql数据库操作(备份,恢复,执行脚本等)。 我希望每个操作都有同步和异步函数,因为这个库将由控制台和GUI应用程序使用,但我不想在任何地方重复代码。 所以我看到它,我有两个选择: 编写在同步函数中执行工作的代码,然后将其包装在async函数的任务中,如下所示: public void BackupDB(string server, string db) { // Do all of the work and long running operation here } public async Task BackupDBAsync(string server, string db) { await Task.Factory.StartNew(() => BackupDB(server, db)).ConfigureAwait(false); } 编写在异步函数中执行工作的代码,并使用.Wait()从同步函数中调用它: public async Task BackupDBAsync(string server, string db) { // Do all of the work and long […]

async-await的延续突发 – 表现不同?

我有一个winform代码,在单击按钮后运行: void button1_Click(object sender, EventArgs e) { AAA(); } async Task BBB( int delay) { await Task.Delay(TimeSpan.FromSeconds(delay)); MessageBox.Show(“hello”); } async Task AAA() { var task1 = BBB(1); // <— notice delay=1; var task2 = BBB(1); // <— notice delay=1; var task3 = BBB(1); // <— notice delay=1; await Task.WhenAll(task1, task2, task3); } 题 : 为什么我会在delay=1时一次看到一个MessageBox: […]

队列或等待列表中的C#异步任务

我有一个像这样的异步任务: public async Task DoWork() { } 我现在有一个: List tmp = new List(); 我在哪里添加任务。 我开始这样的任务: foreach (Task t in tmp) { await t; } 现在我的问题: 什么是启动任务的最佳方式,同时只运行其中3个(直到其他人在等待)? 我想我需要像队列/等待名单一样的东西? 在队列启动后还应该可以添加更多任务。 我使用的是.NET 4.5。 谢谢你的任何建议