将 AsyncCallback 转换为等待任务

编程入门 行业动态 更新时间:2024-10-23 06:25:10
本文介绍了将 AsyncCallback 转换为等待任务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时送ChatGPT账号..

我正在尝试实现给定 url 的下载.顺便说一下,我的代码是:

I'm trying to implement the download of a given url. By the way my code is:

private string url;
private StorageFile outputFile;

public void download()
{
    HttpWebRequest request = HttpWebRequest.CreateHttp(url);
    request.BeginGetResponse(new AsyncCallback(playResponseAsync), request);
}
public async void playResponseAsync(IAsyncResult asyncResult)
{
    //Declaration of variables
    HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState;

    try
    {

        using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult))
        {
            byte[] buffer = new byte[1024];

            using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                using (var outputStream = writeStream.GetOutputStreamAt(0))
                {
                    using (var dataWriter = new DataWriter(outputStream))
                    {
                        using (Stream input = webResponse.GetResponseStream())
                        {
                            var totalSize = 0;
                            for (int size = input.Read(buffer, 0, buffer.Length); size > 0; size = input.Read(buffer, 0, buffer.Length))
                            {
                                dataWriter.WriteBytes(buffer);
                                totalSize += size;    //get the progress of download
                            }
                            await dataWriter.StoreAsync();
                            await outputStream.FlushAsync();
                            dataWriter.DetachStream();
                        }
                    }
                }
            }
            Debug.WriteLine("Finished");
        }
    }
    catch
    {

    }
}
}

我希望我的下载方法具有以下签名

I'd like my download method to have the following signature

Task<bool> download();

(下载成功返回真,否则返回假)

(Returning true if the download succeeded and false otherwise)

使它成为一个等待的任务.但我不掌握 C#,也不知道如何去做.你能帮我吗?

making it an awaitable task. But I do not master C# and don't know how to do it. Can you help me?

谢谢

推荐答案

Task.Factory.FromAsync 是为了简化旧异步模式的使用

Task.Factory.FromAsync is there to simplify usage of old asyncronous pattern

public async Task<bool> download()
{
    HttpWebRequest request = HttpWebRequest.CreateHttp(url);
    HttpWebResponse webResponse = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, request);

    try
    {
        using (webResponse)
        {
            byte[] buffer = new byte[1024];

            using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                using (var outputStream = writeStream.GetOutputStreamAt(0))
                {
                    using (var dataWriter = new DataWriter(outputStream))
                    {
                        using (Stream input = webResponse.GetResponseStream())
                        {
                            var totalSize = 0;
                            for (int size = input.Read(buffer, 0, buffer.Length); size > 0; size = input.Read(buffer, 0, buffer.Length))
                            {
                                dataWriter.WriteBytes(buffer);
                                totalSize += size;    //get the progress of download
                            }
                            await dataWriter.StoreAsync();
                            await outputStream.FlushAsync();
                            dataWriter.DetachStream();
                        }
                    }
                }
            }
            Debug.WriteLine("Finished");
        }
    }
    catch
    {
        return false;
    }
}
return true;
}

但我会按照建议使用更新的 HttpClient

But I would use newer HttpClient as suggested

这篇关于将 AsyncCallback 转换为等待任务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

更多推荐

[db:关键词]

本文发布于:2023-04-25 13:29:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1117723.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:转换为   AsyncCallback

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!