【发布时间】:2021-04-12 18:31:07
【问题描述】:
我在客户端使用WebApi反序列化对象,女巫包含一些轻量级图像,代码如下:
private void Button_Click(object sender, object e)
{
LoadApi();
}
private async void LoadApi()
{
using (var client = new HttpClient())
{
var responseMessage = await client.GetAsync("http://" +
TxtIP.Text + "/api/prod");
if (responseMessage.StatusCode == System.Net.HttpStatusCode.OK)
{
List<ClsProd> lstData = new List<ClsProd>();
var jsonResponse = await
responseMessage.Content.ReadAsStringAsync();
if (jsonResponse != null)
{
lstData = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ClsProd>>(jsonResponse);
}
ListView1.ItemsSource = lstData;
}
}
}
我的 ClsProd 看起来从 Web Api 获取所有数据是:
public class ClsProd : System.ComponentModel.INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public int IAuto { get; set; }
public int IDevc { get; set; }
public string SName { get; set; }
public string SImax { get; set; }
public ImageSource ImgPg { get; set; }
public ClsProd(int auto, int devc, string name, string imax)
{
IAuto = auto;
IDevc = devc;
SName = name;
SImax = imax;
ClsImgBase64 CImg = new ClsImgBase64();
CImg.EvtResult += CImg_EvtResult;
CImg.Start(imax);
}
private void CImg_EvtResult(ImageSource e)
{
ImgPg = e;
NotifyPropertyChanged("ImgPg");
}
}
所有数据都正确获取并显示在列表中,包括string SImax 女巫被图像编码为 Base64 字符串。唯一的问题是没有发生从 base64 字符串到图像的图像转换。
这是我的课程,它没有通过 Task.Run 上的第一条语句,请帮我找出问题所在。当从 async void 调用时,同样的功能也可以工作。
public class ClsImgBase64
{
public event Action<ImageSource> EvtResult;
public ClsImgBase64()
{
}
public void Start(string s)
{
System.Threading.Tasks.Task.Run(async () =>
{
//read stream
byte[] bytes = Convert.FromBase64String(s);
var image = bytes.AsBuffer().AsStream().AsRandomAccessStream();
//decode image
//var decoder = await BitmapDecoder.CreateAsync(image);
image.Seek(0);
//create bitmap
var output = new WriteableBitmap(1, 1);
await output.SetSourceAsync(image);
if (EvtResult != null)
{
EvtResult(output);
}
});
}
}
【问题讨论】:
-
it does not pass the 1st statment on Task.Run你是怎么找到的?为什么你需要一个单独的线程来处理已经async的代码?你想解决什么问题?请使用调试详细信息更新问题。 -
猜测
uwp和android标记是冲突的,因为 UWP 是关于 Windows 而不是 Android。 -
我通过调试所有行发现它没有通过语句 byte[] bytes = Convert.FromBase64String(s);
-
关于 android...是的,它可能不合适,但我正在从事 Uno Project,所以它也可能适用于那里。
-
修正了..抱歉是错字