私はXamarinを使ってC#でプロジェクトをやっています。コンパイラは "非同期メソッド 'HandleWidget_ClickButton'がvoidを返すべきではないことを警告します。ここに例を示します:「非同期メソッドはvoidを返さない」というコードをリファクタリングすることはできますか?
//Code is simplified
public class Widget {
public event Action<int> ClickButton;
private void FireClickButton (int id)
{
if (ClickButton != null) {
ClickButton (id);
}
}
//somewhere else i call FireClickButton(1);
}
public class MyFragment {
private _widget Widget;
public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
//...
_widget = view.FindViewById<Widget> (Resource.Id.widget);
//...
}
public override void OnResume()
{
base.OnResume();
_widget.ClickButton += HandleWidget_ClickButton;
}
async void HandleWidget_ClickButton (int id)
{
await SaveSomethingInStorage (id);
}
}
何かイベント/アクション/デリゲートに何かを返すことはできますか?これが可能かどうか、あるいは構文を書く方法を文法上分かりませんし、私はかなりの時間をかけて解決策を探しました。他の場所では、イベントを処理するときにasync void(async Taskのようなもの)の代わりにasync voidを使用しても問題ありませんが、#Pragma命令を使用して警告を避け、非表示にしたくないと読んでいます。 @hvdから(解答付き)
EDIT:
は、私はこのような私のコードを書き直しました。このようにすると、警告は表示されません。あなたはイベントハンドラを作成していますが、イベントハンドラ用の.NET の規則に従っていません。あなたがすべき。この警告は、イベントハンドラとして検出できるものについて自動的に抑制された です。
イベントハンドラの.NET規則では、タイプ オブジェクトの送信者、EventArgsタイプのイベント引数、またはEventArgsから派生したクラス が必要です。この署名を使用する場合は、もはや の警告が表示されなくなります。あなたがいるEventArgsから派生しなければなりません
public class MyEventArgs : EventArgs { public MyEventArgs (int id) { ID = id; } public int ID; } public class Widget { public event EventHandler<MyEventArgs> ClickTest; void FireClickButton (int id) { if (ClickTest != null) { ClickTest (this, new MyEventArgs (id)); } } } //In observer class _widget.ClickTest += HandleWidget_ClickTest; async void HandleWidget_ClickTest (object sender, MyEventArgs e) { await DoSomethingAsync (e.ID); }
注:
public event EventHandler<int> AnotherClickTest;
if (AnotherClickTest != null) {
AnotherClickTest (this, 1);
}
代わりに 'タスク'を返すことができます。しかし、イベントハンドラはそのルールの例外です - https://msdn.microsoft.com/en-us/magazine/jj991977.aspx – smoksnes
また、この質問を見てください - http://stackoverflow.com/questions/27282617/is-it-safe-as-as-wait-in-asp-net-event-handlers – smoksnes