C# 使用等待内部设置器
我正在尝试从internet异步下载一些图片。我构建了C# 使用等待内部设置器,c#,xamarin,C#,Xamarin,我正在尝试从internet异步下载一些图片。我构建了GetImageBitmapFromUrl方法,如下所示 async Task<Bitmap> GetImageBitmapFromUrl(string url) { Bitmap imageBitmap = null; try { using (var webClient = new WebClient()) { var imageBytes = a
GetImageBitmapFromUrl
方法,如下所示
async Task<Bitmap> GetImageBitmapFromUrl(string url)
{
Bitmap imageBitmap = null;
try
{
using (var webClient = new WebClient())
{
var imageBytes = await webClient.DownloadStringTaskAsync(url);
if (imageBytes != null && imageBytes.Length > 0)
{
imageBitmap = BitmapFactory.DecodeByteArray(Encoding.ASCII.GetBytes(imageBytes), 0, imageBytes.Length);
}
}
}
catch
{
//Silence is gold.
}
return imageBitmap;
}
异步任务GetImageBitmapFromUrl(字符串url)
{
位图imageBitmap=null;
尝试
{
使用(var webClient=new webClient())
{
var imageBytes=await webClient.DownloadStringTaskAsync(url);
if(imageBytes!=null&&imageBytes.Length>0)
{
imageBitmap=BitmapFactory.DecodeByteArray(Encoding.ASCII.GetBytes(imageBytes),0,imageBytes.Length);
}
}
}
抓住
{
//沉默是金。
}
返回图像位图;
}
我现在尝试在setter中调用此方法
List<string> _pictures;
Bitmap[] imageBitmap;
int currentPic = 0;
ImageView gellaryViewer;
public List<string> pictures
{
set
{
if (value.Count == 0)
{
gellaryViewer.Visibility = ViewStates.Gone;
}
else
{
gellaryViewer.Visibility = ViewStates.Visible;
_pictures = value;
currentPic = 0;
imageBitmap = new Bitmap[value.Count];
for (int i = 0; i < value.Count; i++)
//The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.
imageBitmap[i] = await GetImageBitmapFromUrl(value[i]);
displayPic();
}
}
get { return _pictures; }
}
List\u图片;
位图[]图像位图;
int currentPic=0;
ImageView gellaryViewer;
公开列表图片
{
设置
{
如果(value.Count==0)
{
gellaryViewer.Visibility=ViewStates.Gone;
}
其他的
{
gellaryViewer.Visibility=视图状态.Visible;
_图片=价值;
currentPic=0;
imageBitmap=新位图[value.Count];
for(int i=0;i
但是我得到了这个错误只能在异步方法中使用'await'运算符。考虑将此方法标记为“AsiNC”修饰符,并将其返回类型改为“任务”。< /代码>
如何使用“async”修饰符标记setter?查看此问题的答案:
也就是说,我强烈建议将更新功能从属性转移到单独的方法。属性用于提供事物的当前状态,而不是无限期地阻塞。查看此问题的答案:
也就是说,我强烈建议将更新功能从属性转移到单独的方法。属性是用来提供事物的当前状态,而不是无限期地阻塞。简单的回答:你不能。所有属性(包括get
和set
)和同步。保持它的async
功能,你就很好了
复杂的回答:你可以,但它很难看。将async
函数设置为私有函数,并从set
方法调用它。但是由于集合
是同步的,而调用方法是异步的
,因此必须以不同的方式进行调用。查看各种选项
注意:最后一个选项只能在您没有其他选项时使用。调试可能很困难,您可能会遇到不希望出现的竞争条件。简单的回答:您不能。所有属性(包括get
和set
)和同步。保持它的async
功能,你就很好了
复杂的回答:你可以,但它很难看。将async
函数设置为私有函数,并从set
方法调用它。但是由于集合
是同步的,而调用方法是异步的
,因此必须以不同的方式进行调用。查看各种选项
注意:最后一个选项只能在您没有其他选项时使用。调试可能很困难,您可能会遇到不希望出现的竞争条件