我试图用一种新的语法来取代旧的“即发即忘”电话,希望能够更简单,而且似乎正在逃避我。 这是一个例子 class Program { static void DoIt(string entry) { Console.WriteLine("Message: " + entry); } static async void DoIt2(string entry) { await Task.Yield(); Console.WriteLine("Message2: " + entry); } static void Main(string[] args) { // old way Action<string> async = DoIt; async.BeginInvoke("Test", ar => { async.EndInvoke(ar); ar.AsyncWaitHandle.Close(); }, null); Console.WriteLine("old-way main thread invoker finished"); // new […]
MSDN文档似乎声明async和await适用于IO绑定的任务,而Task.Run应该用于CPU绑定的任务。 我正在执行一个应用程序,执行HTTP请求来检索HTML文档,然后parsing。 我有一个像这样的方法: public async Task<HtmlDocument> LoadPage(Uri address) { using (var httpResponse = await new HttpClient().GetAsync(address)) //IO-bound using (var responseContent = httpResponse.Content) using (var contentStream = await responseContent.ReadAsStreamAsync()) return await Task.Run(() => LoadHtmlDocument(contentStream)); //CPU-bound } 这是好的和适当的使用async和await ,或者我过度使用它?
我试图围绕TPL,C#5中新的async / awaitfunction,以及TaskCompletionSource的奥秘。 有一件事情我不清楚的是什么时候使用SetResult , SetException和SetCancel与TrySetResult , TrySetException和TrySetCancel 。 这是MSDN必须说的: 如果任务已处于三种最终状态之一,则此操作将返回false:RanToCompletion,Faulted或Canceled。 如果基础任务已经被处置,这个方法也返回false。 好吧,我明白了,但它并没有真正提供任何指导什么时候或为什么要使用一个。 那么,交易是什么?
自2012年8月以来,C#5.0已经发布。我在哪里可以find规范? 他们已经停止了ECMA规范,但MSDN呢?
我在ASP.NET应用程序中有一个方法,需要花费很多时间才能完成。 根据用户提供的caching状态和参数,在一次用户请求期间,对此方法的调用最多可能发生3次。 每个通话需要大约1-2秒钟才能完成。 该方法本身是对服务的同步调用,并且不可能覆盖实现。 所以对服务的同步调用看起来如下所示: public OutputModel Calculate(InputModel input) { // do some stuff return Service.LongRunningCall(input); } 方法的用法是(注意方法的调用可能会发生一次以上): private void MakeRequest() { // a lot of other stuff: preparing requests, sending/processing other requests, etc. var myOutput = Calculate(myInput); // stuff again } 我试图从我身边改变执行,以提供这种方法的同时工作,这是我到目前为止。 public async Task<OutputModel> CalculateAsync(InputModel input) { return await Task.Run(() => { return […]
我从这个链接复制下面的代码。但是当我编译这个代码时,我得到的入口点不能用'async'修饰符标记 。 我怎样才能使这个代码编译? class Program { static async void Main(string[] args) { Task<string> getWebPageTask = GetWebPageAsync("http://msdn.microsoft.com"); Debug.WriteLine("In startButton_Click before await"); string webText = await getWebPageTask; Debug.WriteLine("Characters received: " + webText.Length.ToString()); } private static async Task<string> GetWebPageAsync(string url) { // Start an async task. Task<string> getStringTask = (new HttpClient()).GetStringAsync(url); // Await the task. This is what […]
我想知道新的C#5.0asynchronousfunction对于Rx – Reactive Extensions是什么意思? 它似乎不是替代品,但似乎重叠 – Task和IObservable 。 编辑: 任务与IObservable:何时使用什么?
我有以下代码, private void button1_Click(object sender, RoutedEventArgs e) { button1.IsEnabled = false; var s = File.ReadAllLines("Words.txt").ToList(); // my WPF app hangs here // do something with s button1.IsEnabled = true; } Words.txt有很多单词,我读入svariables,我试图使用async并在C#5中使用Async CTP Library await关键字,所以WPF应用程序不会挂起。 到目前为止,我有以下代码, private async void button1_Click(object sender, RoutedEventArgs e) { button1.IsEnabled = false; Task<string[]> ws = Task.Factory.FromAsync<string[]>( // What do i have […]
在.NET 4.5 / C#5中, IReadOnlyCollection<T>用Count属性声明: public interface IReadOnlyCollection<out T> : IEnumerable<T>, IEnumerable { int Count { get; } } 我想知道,对于ICollection<T>实现IReadOnlyCollection<T>接口是否有意义: public interface ICollection<T> : IEnumerable<T>, IEnumerable, *IReadOnlyCollection<T>* 这意味着实现ICollection<T>将自动实现IReadOnlyCollection<T> 。 这听起来对我来说很合理。 ICollection<T>抽象可以看作是IReadOnlyCollection<T>抽象的扩展。 请注意, List<T> ,例如,同时实现ICollection<T>和IReadOnlyCollection<T> 。 然而它并没有被devise成这样。 我在这里错过了什么? 为什么会select当前的实施呢? UPDATE 我正在寻找一个使用面向对象devise推理来解释原因的答案: 实现IReadOnlyCollection<T> 和 ICollection<T>具体类如List<T> ICollection<T> 是比以下更好的devise: ICollection<T> IReadOnlyCollection<T>直接实现IReadOnlyCollection<T> 还请注意,这基本上是一样的问题: 为什么IList<T>实现IReadOnlyList<T> ? 为什么不IDictionary<T>实现IReadOnlyDictionary<T> ?
我有以下testing代码: void Button_Click(object sender, RoutedEventArgs e) { var source = new CancellationTokenSource(); var tsk1 = new Task(() => Thread1(source.Token), source.Token); var tsk2 = new Task(() => Thread2(source.Token), source.Token); tsk1.Start(); tsk2.Start(); source.Cancel(); try { Task.WaitAll(new[] {tsk1, tsk2}); } catch (Exception ex) { // here exception is caught } } void Thread1(CancellationToken token) { Thread.Sleep(2000); // If […]