如何防止等待执行?

时间:2019-06-13 08:11:40

标签: c# xamarin xamarin.forms xamarin.android

下面的代码一次执行一个任务。

'sidebar'

我的问题是,此任务中的每一个都具有Internet连接检查器,这意味着当应用程序检测到设备没有Internet连接时,它将检查设备是否具有Internet连接,它将显示显示警报,提示用户。当用户选择不重试时,他/她将被重定向到我的主页。问题来了,例如我的第一个任务( SyncUserClientUpdate )检测到没有连接并且用户选择不重试,他/她将被重定向,但是当进入主页时,显示警报当用户选择不重试时,他/她将被重定向到主页,直到执行完最后一个功能为止,并且将出现另一项任务的错误,并且会发生相同的事情。选择不重试时如何停止其他任务?

await App.TodoManager.SyncUserClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.UpdateContacts(contact);
await App.TodoManager.SyncContactsClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncContactsMedia1ClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncContactsMedia2ClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncContactsMedia3ClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncContactsMedia4ClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncRetailerOutletClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.UpdateCAF(contact);
await App.TodoManager.SyncCAFClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncCAFMedia1ClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncCAFMedia2ClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncCAFMedia3ClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncCAFMedia4ClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncCAFActivityClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncEmailRecipientClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncUserServerUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncSystemSerialServerUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncContactsServerUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncRetailerOutletServerUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncProvinceServerUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncTownServerUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.SyncUserLogsClientUpdate(host, database, ipaddress, contact, SyncStatus);
await App.TodoManager.OnSyncComplete(host, database, ipaddress, contact);

2 个答案:

答案 0 :(得分:1)

您要查找的内容称为x1,y1 = points[0] #top left corner of the first pattern x2,y2 = points[5] #bottom right corner of the first pattern #rectangle rectange = img[y1:y2,x1:x2] 异步CancellationToken

您可以查看由Stephen @Microsoft博客撰写的精彩博客

基本上,您定义了取消令牌

Tasks

然后取消执行它

CancellationToken token = …; 

默认情况下,显示警报还会返回一个布尔值,因此您的if语句可以类似于下面的内容,而您不需要equals操作。

 public static async Task<T> WithCancellation<T>( 
 this Task<T> task, CancellationToken cancellationToken) 
{ 
var tcs = new TaskCompletionSource<bool>(); 
using(cancellationToken.Register( 
            s => ((TaskCompletionSource<bool>)s).TrySetResult(true), tcs)) 
    if (task != await Task.WhenAny(task, tcs.Task)) 
        throw new OperationCanceledException(cancellationToken); 
return await task; 
}

答案 1 :(得分:0)

使用await可以捕获任务异常(reference):

  

要捕获异步任务引发的异常,请将await表达式放在try块中,然后将异常捕获在catch块中

如果任一任务将throw,则后续任务将不会运行。

try
{
    await Task1();
    await Task2();
    ...
}
catch(SomeException e) { ... }

您需要的只是

throw new SomeException(...)

在任务调用的方法内部,以确认用户的操作并选择取消。

有人可能会争辩:“不要将异常用于流控制”。是的,但是如果用户可以中断正常流程,则它被完全接受,因为用户中断程序流属于 exception 情况,因此不会正常发生,它是例外

好的候选者是InvalidOperationException,但是您可能希望创建自定义异常(UserInterruptException)来更可靠地捕获“用户中断”原因。