本文介绍了将 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:关键词]
发布评论