タスクが完了していても戻ってこないという問題があります。私は別のサーバー上にWebサイトとWebサービスを持っています。 Webサイトは、関数myFunction()を持つライブラリを利用するWebサービスを呼び出します。 Webサービスのサーバー上のコンソールアプリケーションからmyFunctionを呼び出すと、期待どおりに戻ります。ただし、WebサービスからmyFunction()を呼び出すためにWebサービスから呼び出しを行うと、 "Step 3"にはなりますが、 "Step 4"にはなりません。私は以下の呼び出しの簡略化されたバージョンを持っています。タスクを待つ完了後に戻ってこない
private string myFunction()
{
string myStr = myDoWork().GetAwaiter().GetResult();
return myStr;
}
private async Task<string> myDoWork()
{
logger.Debug("Step 1");
string answer = await aFunction();
logger.Debug("Step 4");
return answer;
}
public async Task<string> aFunction()
{
logger.Debug("Step 2");
return await bFunction(CancellationToken.None);
}
AsyncLock myLock = new AsyncLock();
public Task<string> bFunction(CancellationToken cToken)
{
return Task.Run(
async() =>
{
using (await myLock(cToken))
{
logger.Debug("Step 3");
result = "Hello";
return result;
}
},
cToken);
}
私はasyncとawaitを初めて使用しているので、助けてください。
可能であれば、 'myFunction()'もasyncでなければなりません。非同期呼び出しをブロックすると奇妙なことが起こります。また、なぜ 'Task.Run'ビジネスが' bFunction'にあるのですか? –
「ステップ4」がここで実行されない理由はありません – Jonesopolis
@NateBarbettiniなぜTask.Runのものなのか分かりません。私はできるだけコードを単純化しようとしましたが、重要な部分に注意を向けました。私は、同期タスクのために非同期であるように書かれたコードを再利用しています。非同期のものを使わずにそれをすべて書き直すことは、かなりの仕事です。 –