Tag: async await

TPL等待任务以特定的返回值完成

我想向X提出不同的Web服务请求,每个Web服务都返回true或false 。 这些任务应该并行执行,我想等待第一个以真值完成的任务。 当我收到真正的价值时,我不想等待其他任务完成。 在下面的示例中,不应等待 t1因为t3首先完成并返回true : var t1 = Task.Run(() => { Thread.Sleep(5000); Console.WriteLine(“Task 1 Excecuted”); return true; }, cts.Token); var t2 = Task.Run(() => { Console.WriteLine(“Task 2 Executed”); return false; }, cts.Token); var t3 = Task.Run(() => { Thread.Sleep(2000); Console.WriteLine(“Task 3 Executed”); return true; }, cts.Token); 基本上我正在寻找具有谓词的Task.WhenAny ,当然不存在。

在异步方法中测试exception

我对此代码有点困惑(这是一个示例): public async Task Fail() { await Task.Run(() => { throw new Exception(); }); } [Test] public async Task TestFail() { Action a = async () => { await Fail(); }; a.ShouldThrow(); } 代码没有捕获exception,并且失败了 期望抛出System.Exception,但没有抛出exception。 我确定我错过了一些东西,但是文档似乎暗示这是要走的路。 一些帮助将不胜感激。

定期以指定的时间间隔运行异步方法

我需要从C#Web应用程序向服务发布一些数据。 用户使用应用程序时收集数据本身(一种使用统计信息)。 我不希望在每个用户的请求期间向服务发送数据,我宁愿在应用程序中收集数据,然后在一个单独的线程中发送单个请求中的所有数据,这不会满足用户的请求(我的意思是用户不必等待服务处理请求)。 为此,我需要一种JS的setInterval模拟 – 每隔X秒启动一次函数,将所有收集的数据刷新到服务中。 我发现Timer类提供了一些类似的( Elapsed事件)。 但是,这允许只运行一次方法,但这不是一个大问题。 它的主要困难是需要签名 void MethodName(object e, ElapsedEventArgs args) 虽然我想启动异步方法,它将调用web服务(输入参数并不重要): async Task MethodName(object e, ElapsedEventArgs args) 任何人都可以建议如何解决所描述的任务? 任何提示赞赏。

为什么无效的异步不好?

所以我理解为什么从异步中返回void通常没有任何意义,但是我遇到了一种我认为完全有效的情况。 考虑以下人为的例子: protected override void OnLoad(EventArgs e) { if (CustomTask == null) // Do not await anything, let OnLoad return. PrimeCustomTask(); } private TaskCompletionSource CustomTask; // I DO NOT care about the return value from this. So why is void bad? private async void PrimeCustomTask() { CustomTask = new TaskCompletionSource(); int result = 0; try […]

如何将其转换为异步任务?

鉴于以下代码…… static void DoSomething(int id) { Thread.Sleep(50); Console.WriteLine(@”DidSomething({0})”, id); } 我知道我可以将其转换为异步任务,如下所示…… static async Task DoSomethingAsync(int id) { await Task.Delay(50); Console.WriteLine(@”DidSomethingAsync({0})”, id); } 通过这样做,如果我多次调用(Task.WhenAll),一切都会比使用Parallel.Foreach或甚至在循环内调用更快更高效。 但是有一分钟,让我们假装Task.Delay()不存在,我实际上必须使用Thread.Sleep(); 我知道实际情况并非如此,但这是概念代码,延迟/睡眠通常是IO操作,其中没有异步选项(例如早期EF)。 我试过以下…… static async Task DoSomethingAsync2(int id) { await Task.Run(() => { Thread.Sleep(50); Console.WriteLine(@”DidSomethingAsync({0})”, id); }); } 但是,虽然它运行没有错误,但Lucien Wischik认为这实际上是不好的做法,因为它只是从池中启动线程来完成每个任务(使用以下控制台应用程序也会更慢 – 如果你在DoSomethingAsync和DoSomethingAsync2之间交换打电话你可以看到完成所需的时间有显着差异)… static void Main(string[] args) { MainAsync(args).Wait(); } static async Task […]

使用TcpListener取消NetworkStream.ReadAsync

请考虑以下简化示例(准备在LinqPad中滚动,需要提升帐户): void Main() { Go(); Thread.Sleep(100000); } async void Go() { TcpListener listener = new TcpListener(IPAddress.Any, 6666); try { cts.Token.Register(() => Console.WriteLine(“Token was canceled”)); listener.Start(); using(TcpClient client = await listener.AcceptTcpClientAsync() .ConfigureAwait(false)) using(var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5))) { var stream=client.GetStream(); var buffer=new byte[64]; try { var amtRead = await stream.ReadAsync(buffer, 0, buffer.Length, cts.Token); Console.WriteLine(“finished”); } catch(TaskCanceledException) […]

entity framework异步发出上下文或查询?

我的下面的查询有异步问题。 我有单例上下文,我试图执行以下查询: var query = await (from parent in Context.ParentTable join child in Context.ChildTable on parent.ID equals child.ID into allResult from ResultValue in allResult.DefaultIfEmpty() where ResultValue.TenantId == tenantId select new Result { Code = parent.Code, Type = parent.Type, ID = ResultValue == null ? 0 : ResultValue.Id }).ToListAsync(); 我的单例上下文如下所示: public class BaseRepository { private readonly […]

如果没有GetAwaiter方法,我可以等待吗?

我看到一些关于设计自定义等待类型的文章: http://books.google.com.br/books?id=1On1glEbTfIC&pg=PA83&lpg=PA83&dq=create+a+custom+awaitable+type 现在考虑以下示例: 和: private async void BtnA_Click(object sender, RoutedEventArgs e) { MessageBox.Show(“Awaiting Button B..”); var sx = Observable.FromEvent(a => (b, c) => a(c), add => BtnB.PreviewMouseDown += add, rem => BtnB.PreviewMouseDown -= rem) .Do(a => a.Handled = true) .Take(1); await sx; MessageBox.Show(“Button B Pressed after Button A”); } private void BtnB_OnClick(object sender, RoutedEventArgs e) […]

使用Task.Run调用异步方法似乎错了?

我最近遇到了这个由我们为我们工作的承包商编写的代码。 它要么是非常聪明或愚蠢(我认为后者,但我想要第二个意见)。 我不是在await async速度。 基本上它的工作方式如下: public bool Send(TemplatedMessageDto message) { return Task.Run(() => SendAsync(message)) .GetAwaiter() .GetResult(); } public async Task SendAsync(TemplatedMessageDto message) { //code doing stuff var results = await _externalresource.DothingsExternally(); //code doing stuff } 现在据我所知,第一个Task.Run()是没有意义且效率低下的? 应该是: public bool Send(TemplatedMessageDto message) { return SendAsync(message)) .GetAwaiter() .GetResult(); } public async Task SendAsync(TemplatedMessageDto message) { //code doing […]

使用CancellationToken取消SQL Server查询

我在SQL Server中有一个长时间运行的存储过程,我的用户需要能够取消它。 我编写了一个如下的小测试应用程序,它演示了SqlCommand.Cancel()方法非常好用: private SqlCommand cmd; private void TestSqlServerCancelSprocExecution() { TaskFactory f = new TaskFactory(); f.StartNew(() => { using (SqlConnection conn = new SqlConnection(“connStr”)) { conn.InfoMessage += conn_InfoMessage; conn.FireInfoMessageEventOnUserErrors = true; conn.Open(); cmd = conn.CreateCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = “dbo.[CancelSprocTest]”; cmd.ExecuteNonQuery(); } }); } private void cancelButton_Click(object sender, EventArgs e) { if (cmd != […]