У меня есть этот XAML для Button.xaml:
<Frame xmlns = "http://xamarin.com/schemas/2014/forms"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:t = "clr-namespace:Japanese.Templates"
xmlns:local = "clr-namespace:Japanese;assembly=Japanese"
x:Class = "Japanese.Templates.Button" x:Name = "this"
VerticalOptions = "FillAndExpand"
HeightRequest = "{DynamicResource GridButtonHeight}" >
<Frame.GestureRecognizers>
<TapGestureRecognizer Command = "{Binding TapCommand, Source = {x:Reference this}}"
CommandParameter = "{Binding ., Source = {x:Reference this}}" />
<TapGestureRecognizer Tapped = "ChangeTheColours" />
</Frame.GestureRecognizers>
<Label Text = "{Binding Text, Source = {x:Reference this}}" x:Name = "ButtonLabel" />
</Frame>
и этот С# в моем приложении для Button.xaml.cs
private async void ChangeTheColours(Object sender, EventArgs e)
{
try
{
if (this.ButtonLabel.Text != null && (string)this.ButtonLabel.Text.Substring(0, 1) != " ")
{
ConfigureColors((Button)sender, "C");
await Task.Delay(200);
ConfigureColors((Button)sender, State);
}
}
catch (Exception ex)
{
Crashes.TrackError(ex,
new Dictionary<string, string> {
{"ChangeTheColours", "Exception"},
{"Device Model", DeviceInfo.Model },
});
}
}
В этом примере можно ли вернуть void для асинхронного метода или есть требование, чтобы я возвращал задачу?
Поскольку это событие, оно не может быть преобразовано в Task
.
Когда вы проверяете Документы Майкрософт:
An event is a member that enables an object or class to provide notifications. Clients can attach executable code for events by supplying event handlers.
Events are declared using event_declarations
И когда вы читаете последнее утверждение, оно говорит:
Each accessor corresponds to a method with a single value parameter of the event type, a void return type, and the same modifiers as the containing event.
Так что все еще нормально, что у меня есть асинхронный возврат void, поскольку я хотел иметь там ожидание?
Да, в случае событий это нормально, так как это ограничение, которое вы не можете изменить, надеюсь, теперь это имеет больше смысла.
Если вы хотите добавить задачу в свой метод, вы обязательно должны сделать свой метод асинхронным. Вам не нужно делать весь метод задачей, если вы не хотите, чтобы он выполнялся в другом потоке.