Tag: taskcompletionsource

WP8 TaskCompletionSource没有得到结果

我有一个WebClient的扩展方法(WP8) public static Task DownloadStringTask(this WebClient webClient, Uri uri) { var tcs = new TaskCompletionSource(); webClient.DownloadStringCompleted += (s, e) => { if (e.Error != null) { tcs.TrySetException(e.Error); } else if (e.Cancelled) { tcs.TrySetCanceled(); } else { tcs.TrySetResult(e.Result); } }; webClient.DownloadStringAsync(uri); return tcs.Task; } 并调用此方法 public string GetResult() { var task = new WebClient().DownloadStringTask(new Uri(“http:\\www.foo.com”)); return […]

如何使用timout取消TaskCompletionSource

我有一个函数,我使用await关键字异步调用: public Task RequestStateForEntity(EntityKey entity, string propName) { var tcs = new TaskCompletionSource(); try { var propInstance = BuildCacheKey(entity, propName); StateCacheItem cacheItem; if (_stateCache.TryGetValue(propInstance, out cacheItem)) { tcs.SetResult( new StateInfo (cacheItem.State.Name, cacheItem.State.Value) ); return tcs.Task; } //state not found in local cache so save the tcs for later and request the state var cacheKey = […]

TaskCompletionSource抛出“尝试将任务转换为已完成的最终状态”

我想使用TaskCompletionSource来包装MyService这是一个简单的服务: public static Task ProcessAsync(MyService service, int parameter) { var tcs = new TaskCompletionSource(); //Every time ProccessAsync is called this assigns to Completed! service.Completed += (sender, e)=>{ tcs.SetResult(e.Result); }; service.RunAsync(parameter); return tcs.Task; } 这段代码第一次运行良好。 但是第二次调用ProcessAsync只需再次分配Completed的事件处理程序(每次都使用相同的service变量),因此它将执行两次! 并且第二次抛出此exception: 在已经完成时尝试转换任务最终状态 我不确定,我应该将tcs声明为类级变量,如下所示: TaskCompletionSource tcs; public static Task ProccessAsync(MyService service, int parameter) { tcs = new TaskCompletionSource(); service.Completed -= completedHandler; […]

使用TaskCompletionSource的TaskCreationOptions的目的是什么?

关于TaskCompletionSource的内部工作原理,我有些不清楚。 当使用Factory创建一个简单的Task ,我希望这个任务在一个线程池中排队,除非我指定TaskCreationOptions.LongRunning ,它将在一个新线程中运行。 我对TaskCompletionSource理解是,我负责在任务结束或失败时触发,并且我完全控制如何管理线程。 然而, TaskCompletionSource的ctor允许我指定一个TaskCreationOptions ,这让我感到困惑,因为我期望Scheduler无法自己处理任务。 在TaskCompletionSource的上下文中TaskCompletionSource的目的是什么? 这是一个使用示例: public Task Download(string url) { TaskCompletionSource tcs = new TaskCompletionSource(TaskCreationOptions.LongRunning); var client = (HttpWebRequest)HttpWebRequest.Create(url); var async = client.BeginGetResponse(o => { try { WebResponse resp = client.EndGetResponse(o); tcs.SetResult(resp); } catch (Exception ex) { tcs.SetException(ex); } }, null); return tcs.Task; }

超时使用TaskCompletionSource实现的异步方法

我有一个blackbox对象,它暴露了一个异步操作的方法,并在操作完成时触发一个事件。 我已经使用TaskCompletionSource将其包装到Task BlackBoxOperationAysnc()方法中 – 效果很好。 但是,在那个异步包装器中,如果在给定的超时后没有收到事件,我想管理用超时错误完成异步调用。 目前我使用计时器管理它: public Task BlackBoxOperationAysnc() { var tcs = new TaskCompletionSource(); const int timeoutMs = 20000; Timer timer = new Timer(_ => tcs.TrySetResult(OpResult.Timeout), null, timeoutMs, Timeout.Infinite); EventHandler eventHandler = (sender, args) => { … tcs.TrySetResult(OpResult.BlarBlar); } blackBox.EndAsyncOpEvent += eventHandler; blackBox.StartAsyncOp(); return tcs.Task; } 这是管理超时的唯一方法吗? 有没有设置我自己的计时器 – 我看不到TaskCompletionSource内置的任何超时?