Tag: async await

是否可以在除C#之外的其他.NET语言中使用async-await?

async-await模式是.NET 4.5和C#5.0中更强大的补充之一 据我所知,它目前仅在C#和VB中可用。 此API是.NET CLR还是C#编译器本身的function? 我真正要问的是 – 我们是否应该期望在其他.NET语言中使用async / await,例如: C ++(通过C ++ / CLI) Python(通过IronPython) PHP(通过Phalanger) JavaScript(通过IronJS) 请注意我一般不会询问异步编程,而是关于async-await模式的细节(同步写入的异步代码)。

任务IsCanceled是假的,而我取消了

当我取消任务时,等待结果仍然为IsCanceled属性返回true。 似乎有些事情出了问题。 请指教。 这是代码: CancellationTokenSource _cancelLationToken = new CancellationTokenSource(); private async void Button_Click(object sender, EventArgs e) { _cancelLationToken = new CancellationTokenSource(); _cancelLationToken.Token.Register(theCallBack); var myTaskToWaitFor = Task.Factory.StartNew(() => WorkHard(_cancelLationToken.Token), _cancelLationToken.Token); await myTaskToWaitFor; int i=0; if(myTaskToWaitFor.IsCanceled) i = i; //breakpoint for debugging else i = i; //breakpoint for debugging <== always ends here… 🙁 } private void […]

使用Async对List .ForEach()的任何指向?

我碰到了这段代码: items.ForEach(async item => { doSomeStuff(); await mongoItems.FindOneAndUpdateAsync(mongoMumboJumbo); await AddBlah(SqlMumboJumbo); }); 使这个.forEach委托有任何意义,或者它只是一个正常的foreach循环吗? 只要包含循环的函数是异步的,默认情况下这将是异步的吗?

C#中的异步方法不是异步的吗?

创建了以下控制台应用程序后,我有点困惑为什么它似乎同步运行而不是异步运行: class Program { static void Main(string[] args) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); var total = CreateMultipleTasks(); stopwatch.Stop(); Console.WriteLine(“Total jobs done: {0} ms”, total.Result); Console.WriteLine(“Jobs done in: {0} ms”, stopwatch.ElapsedMilliseconds); } static async Task CreateMultipleTasks() { var task1 = WaitForMeAsync(5000); var task2 = WaitForMeAsync(3000); var task3 = WaitForMeAsync(4000); var val1 = await task1; […]

ConfigureAwait(false)导致错误而不是死锁的情况

假设我编写了一个依赖于async方法的库: namespace MyLibrary1 { public class ClassFromMyLibrary1 { public async Task MethodFromMyLibrary1(string key, Func<string, Task> actionToProcessNewValue) { var remoteValue = await GetValueByKey(key).ConfigureAwait(false); //do some transformations of the value var newValue = string.Format(“Remote-{0}”, remoteValue); var processedValue = await actionToProcessNewValue(newValue).ConfigureAwait(false); return string.Format(“Processed-{0}”, processedValue); } private async Task GetValueByKey(string key) { //simulate time-consuming operation await Task.Delay(500).ConfigureAwait(false); return string.Format(“ValueFromRemoteLocationBy{0}”, […]

在循环内部,每个异步调用是否使用task的continuewith链接到返回的任务?

最佳实践是收集循环内集合中的所有async调用,并执行Task.WhenAll() 。 但是,想要了解在循环中遇到await时会发生什么,返回的Task包含什么? 那些进一步的async调用呢? 它会创建新任务并按顺序将它们添加到已返回的Task吗? 根据下面的代码 private void CallLoopAsync() { var loopReturnedTask = LoopAsync(); } private async Task LoopAsync() { int count = 0; while(count < 5) { await SomeNetworkCallAsync(); count++; } } 我假设的步骤是 LoopAsync被调用 count设置为零,代码进入while循环,条件被检查 SomeNetworkCallAsync ,等待返回的任务 创建新任务/等待 新任务返回CallLoopAsync () 现在,只要有足够的时间让进程SomeNetworkCallAsync ,如何/以何种方式,将执行下一个代码行如count++和更多的SomeNetworkCallAsync ? 更新 – 基于Jon Hanna和Stephen Cleary : 所以有一个Task,该Task的实现将涉及5次对NetworkCallAsync的调用,但是使用状态机意味着这些任务不需要明确地链接到这个就可以工作。 例如,这允许它根据任务的结果决定是否中断循环,等等。 虽然它们没有链接,但每个调用都会等待前一个调用完成,因为我们使用了await (在状态m / […]

可以在ThreadStart方法中使用“async”吗?

我有一个使用Thread和SemaphoreSlim的Windows服务,每60秒执行一次“工作”。 class Daemon { private SemaphoreSlim _semaphore; private Thread _thread; public void Stop() { _semaphore.Release(); _thread.Join(); } public void Start() { _semaphore = new SemaphoreSlim(0); _thread = new Thread(DoWork); _thread.Start(); } private void DoWork() { while (true) { // Do some work here // Wait for 60 seconds, or exit if the Semaphore is released […]

在Task.WhenAll中完成任务时是否有回调

假设我有以下内容: IEnumerable<Task> tasks = //… TimeSpan[] results = await Task.WhenAll(tasks); // Handle results 当我能够处理结果时,所有任务必须完成。 有没有办法按需处理每个结果? 就像注册任务完成时将执行的委托/回调一样: IEnumerable<Task> tasks = //… await Task.WhenAll(tasks, result => { // A task has finished. This will get executed. // result is of type TimeSpan });

设置超时时HttpClient挂起(Windows Phone)

我正在尝试在Windows Phone App中将超时设置为HttpClient对象。 但是如果在超时之前未完成请求,则GetAsync永远不会返回值。 我正在使用以下代码来获得响应: HttpClientHandler handler = new HttpClientHandler(); HttpClient client = new HttpClient(handler); client.Timeout = TimeSpan.FromSeconds(5); client.BaseAddress = new Uri(“http://www.foo.com”); HttpResponseMessage response = await client.GetAsync(“/boo.mp3”);//<–Hangs byte[] data = await response.Content.ReadAsByteArrayAsync(); 如何正确设置超时以从GetAsync获取结果?

await / async Microsoft Practices企业库数据

我有一个较旧的应用程序,我在其中使用Microsoft.Practices.EnterpriseLibrary.Data从数据库中获取数据。 我最近升级到.NET 4.5并希望利用await / async 。 根据命名标准,我没有看到任何以“Async”结尾的方法,即使在最新版本的软件包中也是如此。 是否可以在不手动使其异步的情况下对此ADO .NET库使用await / async?