Tag: c# 5.0

如何正确编写异步方法?

所以我想学习在C#中使用’async’和’await’的基础知识,但我不确定我在这里做错了什么。 我期待以下输出: Calling DoDownload DoDownload done […output here…] 但我没有得到下载的输出,我也期望“完成”,但这需要一段时间。 不应该立即输出吗? 此外,我似乎无法获得字符串结果。 这是我的代码: namespace AsyncTest { class Program { static void Main(string[] args) { Debug.WriteLine(“Calling DoDownload”); DoDownloadAsync(); Debug.WriteLine(“DoDownload done”); } private static async void DoDownloadAsync() { WebClient w = new WebClient(); string txt = await w.DownloadStringTaskAsync(“http://www.google.com/”); Debug.WriteLine(txt); } } }

C#异步等待澄清?

我在这里读到: 等待检查等待它是否已经完成; 如果等待已经完成,那么该方法就会继续运行(同步,就像常规方法一样)。 什么 ? 当然它还没有完成,因为它还没有开始! 例子: public async Task DoSomethingAsync() { await DoSomething(); } 在这里await检查await它是否已经完成(根据文章),但它(DoSomething)尚未开始活动! ,结果总是 false 如果文章要说: Await检查等待是否已经在x毫秒内完成; (超时) 我可能在这里错过了什么..

HttpContent.ReadAsStringAsync导致请求挂起(或其他奇怪的行为)

我们正在构建一个高度并发的Web应用程序,最近我们已经开始广泛使用异步编程(使用TPL和async / await )。 我们有一个分布式环境,应用程序通过REST API(构建在ASP.NET Web API之上)相互通信。 在一个特定的应用程序中,我们有一个DelegatingHandler ,在调用base.SendAsync (即,在计算响应之后)将响应记录到文件中。 我们在日志中包含响应的基本信息(状态代码,标题和内容): public static string SerializeResponse(HttpResponseMessage response) { var builder = new StringBuilder(); var content = ReadContentAsString(response.Content); builder.AppendFormat(“HTTP/{0} {1:d} {1}”, response.Version.ToString(2), response.StatusCode); builder.AppendLine(); builder.Append(response.Headers); if (!string.IsNullOrWhiteSpace(content)) { builder.Append(response.Content.Headers); builder.AppendLine(); builder.AppendLine(Beautified(content)); } return builder.ToString(); } private static string ReadContentAsString(HttpContent content) { return content == null ? […]

如果有条件,是否可以使用Task ?

在Windows Phone 8中,我有方法public async Task authentication() 。 该函数的返回类型是bool但是当我尝试在if条件中使用其返回值时,错误表示无法将Task转换为bool 。 public async Task authentication() { var pairs = new List<KeyValuePair> { new KeyValuePair (“user”, _username), new KeyValuePair (“password”, _password) }; var serverData = serverConnection.connect(“login.php”, pairs); RootObject json = JsonConvert.DeserializeObject(await serverData); if (json.logined != “false”) { _firsname = json.data.firsname; _lastname = json.data.lastname; _id = json.data.id; _phone = […]

同时从同一个SslStream中读取?

我目前正在从SslStream中读取XML数据。 该流来自TcpClient对象。 using (XmlReader r = XmlReader.Create(sslStream, new XmlReaderSettings() { Async = true })) { while (await r.ReadAsync()) { ResetStream = false; switch (r.NodeType) { case XmlNodeType.XmlDeclaration: … break; case XmlNodeType.Element: … 另外,我想直接从TcpClient读取每个位和字节,无论它是否是XML数据。 如何两次读取相同的流? 是否可以使用XmlReader读取它并以某种方式转储流内容? 我想看看来自流的内容以及如何通过XmlReader解析它以进行调试。 更新: 我想保持一个流运行,而不是有两个独立的流。 由于我已经拥有了数据,因此在我的应用程序中将它再次存储在内存中是没有意义的。

异步方法不立即返回

我正在使用此解决方案: 如何正确编写异步方法? 但是,异步方法似乎不会立即返回,而是需要一段时间。 这里是 class Program { static void Main(string[] args) { Debug.WriteLine(“Calling DoDownload”); var downloadTask = DoDownloadAsync(); Debug.WriteLine(“DoDownload done”); downloadTask.Wait(); //Waits for the background task to complete before finishing. } private static async Task DoDownloadAsync() { WebClient w = new WebClient(); string txt = await w.DownloadStringTaskAsync(“http://www.google.com/”); Debug.WriteLine(txt); } } 在下载文本之前正在打印“DoDownload Done”,但这需要一段时间(我认为它正在等待下载完全返回打印它。)我做错了什么?

async等待执行windows phone 8

我是异步的新手,等待编程风格。 如何解决以下问题: 我先调用下面的代码。 这里的问题是第一行正在等待填充categoriesvm.Categorieslist哪个需要,但它没有,但第二行被调用。 (我认为这是await的默认行为) 如何在第一行填充categoriesvm.Categorieslist时确保仅调用第二行? protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { categoriesvm.GetCategories(); BookCategories.DataContext = from vm in categoriesvm.Categorieslist select vm; } 在上面的代码中,当我执行第一行时,它会进入下面,其中Categorieslist是我上面访问的列表。 public async void GetCategories() { Categorieslist = new ObservableCollection(await PhoneClient.GetDefaultCategories()); } phoneclient在下面 public class PhoneClient { private static readonly HttpClient client; public static Uri ServerBaseUri { get { return new Uri(“http://169.254.80.80:30134/api/”); } […]

AZURE:在workerrole中异步运行Run()

我有一个异步任务。 async Task UploadFiles() { } 我想在azure workerrole的Run()方法中对UploadFiles()调用’await’。 但’await’仅适用于声明为异步的方法。 所以我可以像下面那样使Run()方法异步: public override void Run() { UploadFiles(); } 至 public async override void Run() { await UploadFiles(); }

Winforms异步加载大数据?

我刚收到几年前开发的旧应用程序的错误列表,我需要解决的一件事是将数据加载到一个屏幕所需的时间,当然,屏幕被冻结,不幸的是这是在WinForms .NET 4.5中。 数据被加载到WinForms DataGridView中。 我想知道是否有任何方法使用C#5 async加载此数据并等待,同时刷新网格以添加下一组数据。 它可能是在滚动或在后台。任何想法?

C#5 ReadAsync和迭代器

我试图将下面的类转换为懒惰返回一个文件。 public class ObservableFile2 : IObservable { private readonly IObservable subject; public ObservableFile2(string fileName) { subject = Observable.Using ( () => new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)), streamReader => ObserveLines(streamReader) ); } private IObservable ObserveLines(StreamReader streamReader) { return ReadLines(streamReader).ToObservable(); } private IEnumerable ReadLines(StreamReader streamReader) { while (!streamReader.EndOfStream) { yield return streamReader.ReadLine(); } } public IDisposable […]