[解決済み] 暗黙のうちに型 'string' を 'System.Threading.Tasks.Task<string>' に変換できない
質問
私は非同期プログラミングの初心者なので、いくつかの非同期サンプルコードを見て、簡単な非同期コードを書こうと思いました。
私は簡単なWinformアプリケーションを作成し、フォームの中に次のコードを書きました。しかし、それはちょうど動作しません
private Task<string> methodAsync() {
Thread.Sleep(10000);
return "Hello"; //Error: Cannot implicitly convert type 'string' to 'System.Threading.Tasks.Task<string>'
}
private async void button1_Click(object sender, EventArgs e)
{
string s = await methodAsync();
MessageBox.Show(s);
}
誰かここに光を当ててください...
どのように解決するのですか?
メソッドのリストされた戻り値の型は
Task<string>
. を返そうとしています。
string
. これらは同じではありませんし、文字列から暗黙のうちに
Task<string>
への暗黙の変換もないため、エラーになります。
と混同している可能性があります。
async
メソッドで、返り値が自動的に
Task
で自動的にラップされます。 現在、そのメソッドは非同期メソッドではありません。 ほぼ間違いなくこれを意図しているはずです。
private async Task<string> methodAsync()
{
await Task.Delay(10000);
return "Hello";
}
2つの重要な変更があります。 まず、このメソッドは
async
とマークされています。これは、戻り値の型が
Task
で包まれ、メソッドがコンパイルできるようになります。 次に、ブロッキング待ちをしないようにします。 一般的なルールとして
await
モデルを使うときは、できる限りブロック待ちを避けるようにしましょう。
Task.Delay
は、指定されたミリ秒後に完了するタスクです。 によって
await
-を指定することで、その時間だけノンブロッキングで待機することになります(実際には、このメソッドの残りの部分はそのタスクの継続です)。
を使用しない 4.0 の方法を好むのであれば、このメソッドでは
await
を使わずに、4.0の方法を好むなら、こうすることができます。
private Task<string> methodAsync()
{
return Task.Delay(10000)
.ContinueWith(t => "Hello");
}
最初のバージョンは、多かれ少なかれこのようなものにコンパイルされますが、エラー処理および
await
の機能をサポートするためのボイラープレート コードが含まれています。
もしあなたの
Thread.Sleep(10000)
が、単にしばらく待つだけでなく、長く実行されるメソッドのプレースホルダとして本当に意図されているなら、作業が現在のコンテキストではなく、別のスレッドで行われることを確実にする必要があるでしょう。 これを行う最も簡単な方法は
Task.Run
:
private Task<string> methodAsync()
{
return Task.Run(()=>
{
SomeLongRunningMethod();
return "Hello";
});
}
というか、もっとありそう。
private Task<string> methodAsync()
{
return Task.Run(()=>
{
return SomeLongRunningMethodThatReturnsAString();
});
}
関連
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み] Interopタイプの組み込みができない
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] DateTime型の誕生日から年齢を計算するにはどうしたらいいですか?
-
[解決済み] 型チェック:typeof、GetType、is?
-
[解決済み] UTF-8 byte[]を文字列に変換する方法
-
[解決済み】大文字・小文字を区別しない「Contains(string)
-
[解決済み】C#で文字列をenumに変換する
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。