下面的代码一次执行一个任务。
'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);
答案 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
)来更可靠地捕获“用户中断”原因。