私はwebservicesの初心者ですが、 で実行しました。これはWebサービスと非同期ログに関する問題です。 (C#)C#Webservice:非同期メソッドを呼び出すWebmethodがTaskoffオブジェクトを返します
問題の説明
私は、クライアント(asp.netのウェブサイト)にいくつかのデータを返すWebサービスを持っています。
[WebMethod]
public MyClass getData()
{
//Do some work
return _myClassObject;
}
これまでのところ、これはかなりうまくいきます。
Webサービスが公開されたら、何が起こっているのか知りたいので、簡単なロギングを実装しようとしました。
次のクラス(簡体字)がログを処理します。
public static class Logwriter
{
public static void writeToLog(string txt)
{
//writes log to db
}
}
私は、これは非同期に発生しますので、Webサービスを遅くはありません。
。したがって、私はWebMethod属性変更:私は私のasp.netのウェブサイトにServiceReferenceを更新した後
[WebMethod]
public async Task<MyClass> getData()
{
await Task.Run(() => Logwriter.writeToLog("Someone requested the WebMethod 'GetData'"));
//Do some work
return _myClassObject;
}
を私はウェブサーバは、もはや「MyClassの」-objectを返すことに気づいていないが、「TaskOffCustomClass」-object 。私は "TaskOffMyClass"オブジェクトから "MyClass"オブジェクトを取得する解決策を見つけられませんでした。
質問私は "TaskOffMyClass" から私の "MyClassの" オブジェクトを取得できますか
?
ロギングを非同期で行い、依然として "MyClass" -Objectを返す可能性はありますか? (タスクの使用中)
私はスレッドでロギングを行うことを考えましたが、Task over Threadを使用するにはrecommendedであることも読んでいます。スレッドへの切り替えの影響はどれくらいかかりますか?あなたが最初のバージョンで
MyClass result = await service.getData();
または
Task<MyClass> task = service.getData(); MyClass result = task.Result;
を使用することができますいずれか
'async'と' await'は、あなたが思うように動作しません。上記のコードで行ったことは、その一部を別のスレッドで実行させることですが、元のスレッドが続行される前にそのスレッドが実行を終了するまで待ちます。私はあなたに 'async'と' await'について学ぶ時間を増やすことを強くお勧めします。 Eric Lippertのブログには、それを説明している数多くの記事がありました。 –
こんにちは@Damien_The_Unbliever、ご意見ありがとうございます。私は間違いなくEric Lippertsのブログを見ていきます。 – Martin