C# 程序在未执行wait的情况下退出功能
我在我的程序中使用了两个wait函数,第一个可以完美地工作,但是当遇到第二个wait时,我的程序没有执行这个等待函数和之后的任何一行 不出错,甚至不崩溃 尝试了“等待()”、“在主线程上运行”、“任务运行”、“线程睡眠” 下面是一段代码C# 程序在未执行wait的情况下退出功能,c#,.net,xamarin.forms,C#,.net,Xamarin.forms,我在我的程序中使用了两个wait函数,第一个可以完美地工作,但是当遇到第二个wait时,我的程序没有执行这个等待函数和之后的任何一行 不出错,甚至不崩溃 尝试了“等待()”、“在主线程上运行”、“任务运行”、“线程睡眠” 下面是一段代码 private async void Btn_Clicked(object sender, EventArgs e) { //this statement works perfectly fine var status = await
private async void Btn_Clicked(object sender, EventArgs e)
{
//this statement works perfectly fine
var status = await CrossPermissions.Current.RequestPermissionAsync<LocationPermission>();
//on debugging i found out it return out of function at this point without executing
var check = await CrossPermissions.Current.RequestPermissionAsync<CameraPermission>();
//None of the code is executed
Console.WriteLine("Granted");
Console.WriteLine("Granted");
}
private async void Btn\u已单击(对象发送方,事件参数e)
{
//这句话很好用
var status=await CrossPermissions.Current.RequestPermissionAsync();
//在调试时,我发现它在没有执行的情况下,此时返回功能
var check=wait CrossPermissions.Current.RequestPermissionAsync();
//没有执行任何代码
控制台。书面形式(“授权”);
控制台。书面形式(“授权”);
}
您尝试使用以下方法:
private async void Btn_Clicked(object sender, EventArgs e)
{
await GetPermissions();
}
public static async Task<bool> GetPermissions()
{
bool permissionsGranted = true;
var permissionsStartList = new List<Permission>()
{
Permission.Location,
Permission.Camera,
};
var permissionsNeededList = new List<Permission>();
try
{
foreach (var permission in permissionsStartList)
{
var status = await CrossPermissions.Current.CheckPermissionStatusAsync(permission);
if (status != Plugin.Permissions.Abstractions.PermissionStatus.Granted)
{
permissionsNeededList.Add(permission);
}
}
}
catch (Exception ex)
{
}
var results = await CrossPermissions.Current.RequestPermissionsAsync(permissionsNeededList.ToArray());
try
{
foreach (var permission in permissionsNeededList)
{
var status = Plugin.Permissions.Abstractions.PermissionStatus.Unknown;
//Best practice to always check that the key exists
if (results.ContainsKey(permission))
status = results[permission];
if (status == Plugin.Permissions.Abstractions.PermissionStatus.Granted || status == Plugin.Permissions.Abstractions.PermissionStatus.Unknown)
{
permissionsGranted = true;
}
else
{
permissionsGranted = false;
break;
}
}
}
catch (Exception ex)
{
}
return permissionsGranted;
}
private async void Btn\u已单击(对象发送方,事件参数e)
{
等待GetPermissions();
}
公共静态异步任务GetPermissions()
{
bool permissionsGranted=true;
var permissionsStartList=新列表()
{
许可,地点,
允许,摄像机,
};
var PermissionsNeedList=新列表();
尝试
{
foreach(permissionsStartList中的var权限)
{
var status=await CrossPermissions.Current.CheckPermissionStatusAsync(权限);
if(status!=Plugin.Permissions.Abstractions.PermissionStatus.grated)
{
PermissionsNeedList.Add(权限);
}
}
}
捕获(例外情况除外)
{
}
var results=await CrossPermissions.Current.RequestPermissionsAsync(permissionsNeedList.ToArray());
尝试
{
foreach(权限需求列表中的var权限)
{
var status=Plugin.Permissions.Abstractions.PermissionStatus.Unknown;
//始终检查密钥是否存在的最佳实践
if(结果。容器(许可))
状态=结果[权限];
if(状态==Plugin.Permissions.Abstractions.PermissionStatus.grated | |状态==Plugin.Permissions.Abstractions.PermissionStatus.Unknown)
{
permissionsGranted=真;
}
其他的
{
permissionsGranted=false;
打破
}
}
}
捕获(例外情况除外)
{
}
返回许可证;
}
可能是跨线程冲突。RequestPermission是否访问其他线程?我唯一一次“随机”跳过代码,它总是跨线程违反,在某些开发配置中不会引发异常。我想,但我不确定。如果这就是问题所在,那么解决方案可能是什么?您使用的是哪种技术?在winforms中,您可以使用Invoke来访问UI线程。我使用的是Xamarin表单,但我尝试在主线程中调用它,但没有成功。这是第二次等待。我试着切换订单,摄像机提示显示,但地点没有。同样,它也不会出现在Catch语句中。