Tag: async await

C#中具有超时function的通用异步重试

我有几百个对各种外部API的调用,我希望将其包装在能够进行重试和处理超时的通用异步函数中。 基本上,我认为我需要实现类似这样的函数调用: await Retry(()=>someFunctionAsync(doWorkParams, new CancellationToken()), retryCount, timeout); 如何定义此类重试function? 另外,如何从同步代码中调用此function,因为我的调用大量存在于同步方法中?

SignalR – 如何在集线器中执行异步任务?

我正在尝试使用C#5异步/等待function创建SignalR应用程序,但每当代码运行时,它将抛出System.InvalidOperationException。 这是重现问题的最简单的代码。 public class SampleHub : Hub { public Task GetGoogle() { var http = new WebClient(); return http.DownloadStringTaskAsync(“http://www.google.com”); } } 例外细节: 此时无法启动异步操作。 异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。 如果在执行页面时发生此exception,请确保将页面标记为。 堆栈跟踪: at System.Web.AspNetSynchronizationContext.OperationStarted() at System.Net.WebClient.DownloadStringAsync(Uri address, Object userToken) at System.Net.WebClient.DownloadStringTaskAsync(Uri address) at System.Net.WebClient.DownloadStringTaskAsync(String address) 在客户端,Javascript看起来像这样。 $.connection.hub.start().done(function () { $(‘#google’).click(function () { var google = sample.server.getGoogle(); console.log(google); }); }); 我做错了什么? 有没有解决方法? […]

如何moqentity frameworkSaveChangesAsync?

Mock dbContext; [TestFixtureSetUp] public void SetupDbContext() { dbContext = new Mock(); dbContext.Setup(c => c.SaveChanges()).Verifiable(); dbContext.Setup(c => c.SaveChangesAsync()).Verifiable(); dbContext.Setup(c => c.Customers.Add(It.IsAny())) .Returns(It.IsAny()).Verifiable(); } [Test] public async Task AddCustomerAsync() { //Arrange var repository = new EntityFrameworkRepository(dbContext.Object); var customer = new Customer() { FirstName = “Larry”, LastName = “Hughes” }; //Act await repository.AddCustomerAsync(customer); //Assert dbContext.Verify(c => c.Customers.Add(It.IsAny())); dbContext.Verify(c […]

将async / await与Result混合

让我先简单介绍一下这个问题: 我已经阅读了几个SO问题,说你不应该这样做(比如如何安全地混合同步和异步代码 ) 我已经读过Async / Await – 异步编程中的最佳实践再次说你不应该这样做 所以我知道这不是最佳做法,也不需要任何人告诉我这样做。 这更像是“为什么这个工作”的问题。 有了这个,这是我的问题: 我写了一个小的GUI应用程序,它有2个按钮和一个状态标签。 其中一个按钮将在100%的时间内重现同步和异步的死锁问题。 另一个按钮调用相同的异步方法,但它包含在一个任务中,这个工作。 我知道这不是一个好的编码实践,但我想理解它为什么没有相同的死锁问题。 这是代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private async Task DelayAsync() { await Task.Delay(1000); return “Done”; } private void buttonDeadlock_Click(object sender, EventArgs e) { labelStatus.Text = “Status: Running”; // causes a deadlock because of […]

并行运行异步方法

我有一个异步方法GetExpensiveThing() ,它执行一些昂贵的I / O工作。 这就是我使用它的方式: // Serial execution public async Task<List> GetThings() { var first = await GetExpensiveThing(); var second = await GetExpensiveThing(); return new List() { first, second }; } 但由于这是一种昂贵的方法,我想并行执行这些调用。 我本以为移动等待会解决这个问题: // Serial execution public async Task<List> GetThings() { var first = GetExpensiveThing(); var second = GetExpensiveThing(); return new List() { await first, […]

想了解异步

我已经使用了异步编码,但我并不完全理解如何使用它 – 尽管我理解这个概念以及为什么需要它。 这是我的设置: 我有一个Web API,我将从我的ASP.NET MVC应用程序调用,我的Web API将调用DocumentDB。 在代码示例中,我在向DocumentDB发送查询时看到了很多等待关键字。 如果我需要在我的MVC应用程序异步中使我的索引操作方法,我很困惑? 如果我的Web API中的CreateEmployee()方法应该是异步的,我也很困惑? 在这种情况下使用异步的正确方法是什么? 这是我的代码(这段代码目前给我错误,因为我的MVC动作方法不是异步)—- ASP.NET MVC应用程序代码—- public ActionResult Index() { Employee emp = new Employee(); emp.FirstName = “John”; emp.LastName = “Doe”; emp.Gender = “M”; emp.Ssn = “123-45-6789”; using (var client = new HttpClient()) { client.BaseAddress = new Uri(“http://myWebApi.com”); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/json”)); HttpResponseMessage response = await […]

我正在尝试将同步方法从一些旧代码转换为异步方法,但我有一些麻烦

我正在尝试将同步方法从一些旧代码转换为异步方法,但我有一些麻烦。 从我读过的所有video和教程中,他们似乎都在创建方法,一个是实际的函数,另一个是包装器,然后是在UI上调用的包装器。 这是我的代码: private async Task login(String username, String password) { var tcs = new TaskCompletionSource(); RestSharp.RestRequest request = new RestSharp.RestRequest(“/accounts/login/”, RestSharp.Method.GET); RestSharp.IRestResponse response = client.Execute(request); // Make the login request request = new RestSharp.RestRequest(“/accounts/login/”, RestSharp.Method.POST); request.AddParameter(“username”, username); request.AddParameter(“password”, password); response = client.Execute(request); // Return loggin status dom = response.Content; return dom[“html”].HasClass(“logged-in”); } 出于某种原因,当我尝试从按钮单击调用UI线程上的方法时,它要求我使按钮事件异步。 txtLog.AppendText(“Before […]

如何启动EF6异步中的实体存储过程而不等待返回?

我想直接调用SQL Server而不是等待返回。 我有一个来自存储过程的导入实体函数,我想在Entity Framework 6.0.0-rc1中以这种方式异步调用。 这可能吗? 语法是什么? Entity Function: RecalculateBudgetNumbers(int id)

清理TPL中的CallContext

根据我是使用基于异步/等待的代码还是基于TPL的代码,我在清理逻辑CallContext遇到两种不同的行为。 如果我使用以下async / await代码,我可以完全按照我的预期设置和清除逻辑CallContext : class Program { static async Task DoSomething() { CallContext.LogicalSetData(“hello”, “world”); await Task.Run(() => Debug.WriteLine(new { Place = “Task.Run”, Id = Thread.CurrentThread.ManagedThreadId, Msg = CallContext.LogicalGetData(“hello”) })) .ContinueWith((t) => CallContext.FreeNamedDataSlot(“hello”) ); return; } static void Main(string[] args) { DoSomething().Wait(); Debug.WriteLine(new { Place = “Main”, Id = Thread.CurrentThread.ManagedThreadId, Msg = CallContext.LogicalGetData(“hello”) }); } […]

库中的Task.Yield()需要ConfigureWait(false)

建议您随时使用ConfigureAwait(false) ,尤其是在库中,因为它可以帮助避免死锁并提高性能。 我编写了一个大量使用async的库(访问数据库的Web服务)。 该库的用户遇到了僵局,经过多次痛苦的调试和修补后,我将其追踪到单独使用await Task.Yield() 。 我等待的其他地方,我使用.ConfigureAwait(false) ,但是在Task.Yield()上不支持。 对于需要相当于Task.Yield().ConfigureAwait(false)情况,建议使用什么解决方案Task.Yield().ConfigureAwait(false) ? 我已经了解了如何删除SwitchTo方法 。 我可以看出为什么这可能是危险的,但为什么没有相当于Task.Yield().ConfigureAwait(false) ? 编辑: 为了提供我的问题的进一步背景,这里是一些代码。 我正在实现一个开源库,用于访问支持异步的DynamoDB(作为AWS的服务的分布式数据库)。 许多操作返回IX-Async库提供的IAsyncEnumerable 。 该库不提供从以“块”提供行的数据源生成异步枚举的好方法,即每个异步请求返回许多项。 所以我有自己的通用类型。 该库支持预读选项,允许用户指定在调用MoveNext()实际需要之前应该请求多少数据。 基本上,这是如何工作的,我通过调用GetMore()并在这些之间传递状态来请求块。 我将这些任务放在一个chunks队列中并将它们出列并将它们转换为我放入单独队列的实际结果。 NextChunk()方法是这里的问题。 根据ReadAhead的值,我将在最后一个完成(All)之后保持获取下一个块,直到需要一个值但不可用(None)或仅获取超出当前值的下一个块使用(一些)。 因此,获取下一个块应该并行/不阻止获取下一个值。 枚举器代码是: private class ChunkedAsyncEnumerator : IAsyncEnumerator { private readonly ChunkedAsyncEnumerable enumerable; private readonly ConcurrentQueue<Task> chunks = new ConcurrentQueue<Task>(); private readonly Queue results = new Queue(); private CancellationTokenSource cts […]