I seem to be going round in circles with this problem i'm having. The old code I was using is as follows:
private ImageSource LoadImg(string url)
{
WebClient MyWebClient = new WebClient();
byte[] BytesFile = MyWebClient.DownloadData(url);
Stream m2 = new MemoryStream(BytesFile);
return ImageSource.FromStream(() => m2);
}
And I could consume this really easily by just calling:
mainimg.Source = LoadImg(url);
Now I want to convert this into async and use httpClient as WebClient is being discontinued? So I tried doing this
private async Task<ImageSource> LoadImg2Async(url)
{
System.Diagnostics.Debug.WriteLine("Firing LoadImg2");
var httpResult = await Client.GetAsync(url);
using var resultStream = await httpResult.Content.ReadAsStreamAsync();
//using var fileStream = File.Create(@"c:\dev\yaythisworks.png");
//resultStream.CopyTo(fileStream);
return ImageSource.FromStream(() => resultStream);
}
Seems to make sense, at least a little bit. But, then how do I consume this return from a task? I have tried:
mainimg.Source = LoadImg2Async(url).Result;
but I can't get it to work
Does anyone have any ideas? I have honestly tried searching for answers on google this time, Can't find any answers on how to return from tasks.
Thank you so much
Andrew
Thanks for everyone's help, you helped me get on the right path!
It looks like it is not possible to return a stream from httpClient, I'm not sure why. When I was fiddling round it looks like the stream may be empty?! Anyway, the only way I found around this was to return bytes.
I had to change the Task return type to byte, and then return ms.ToArray();
private async Task<byte[]> LoadImg2Async(string pathtopdf)
{ System.Diagnostics.Debug.WriteLine(pathtopdf);
string pdfpathcorr = pathtopdf.Replace(@"Y:\", roothttpaddy);
string url = pdfpathcorr.Replace(@"\", "/");
System.Diagnostics.Debug.WriteLine("Corrected URL STRING = " + url);
var httpResult = await Client.GetAsync(url);
byte[] bytearray = await httpResult.Content.ReadAsByteArrayAsync();
MemoryStream iStream = new MemoryStream(bytearray);
PdfFixedDocument document = new PdfFixedDocument(iStream);
PdfRendererSettings settings = new PdfRendererSettings();
settings.DpiX = 10;
settings.DpiY = 10;
MemoryStream ms = new MemoryStream();
PdfPageRenderer renderer = new PdfPageRenderer(document.Pages[0]);
renderer.ConvertPageToImage(ms, PdfPageImageFormat.Png, settings);
//FileStream stm = File.OpenWrite(@"c:\dev\pdf " + fileid.ToString() + ".png");
//renderer.ConvertPageToImage(stm, PdfPageImageFormat.Png, settings);
ms.Position = 0;
return ms.ToArray();
}
Then to consume it I need to
byte[] bytearray = await LoadImg2Async(item.PDFPath);
MemoryStream stream = new MemoryStream(bytearray);
item.pdfpathconvert = ImageSource.FromStream(() => stream);
It does work, but it seems very clunky. I am reading bytes from httpClient, then putting it in a stream, then converting to image and returning bytes from async task, and then I have to put it into a new stream to convert it into an ImageSource.
Any tips or suggestions?
I know my code might not be the most streamlined, I was just trying to go through it in a logical way at the moment, but any tips would be welcomed.
Thanks
Andrew