3

studio 2012をインストールした後、フレームワーク4.0を対象とするアプリケーションを構築します。エラーが発生しました:

Type 'System.Threading.Tasks.Task' cannot be serialized. 
Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with ....

svcutilを使用してサービス参照を再生成しました。すべての非同期のものが参照から除外されるように指定する方法はありますか?

4

2 に答える 2

3

私の知る限り、.NET 4.0 では WCF タスク ベースの非同期パターンを使用できません (ただし、Visual Studio 2012 用の Async Targeting Packをインストールする必要があります)。それを機能させるには、.NET 4.5 にアップグレードする必要があります。

Visual Studo 2010 で何らかの拡張機能 ( AsynCTP など) を使用していたと思われます。

ここでは、フレームワークの各バージョンでサポートされている非同期パターンを確認できます。

于 2013-01-03T14:02:28.713 に答える
2

理由はわかりませんが、一部のビルド環境では、/syncOnlyVisual Studio 2012 にアップグレードした後、サービスのインターフェイスを生成するスイッチを svcutil コマンド ラインに追加する必要があるようです。 Visual Studio 2012 を使用してデスクトップでローカルに実行すると、すべての非同期メソッドがインターフェイスに追加され、すべて正常に動作します。しかし、別のビルド マシンでビルドし、3 番目のマシンで実行すると、あなたが説明したようなエラーが発生します。http://www.aspdotnethelp.com/a/d/type-system-threading-tasks-task1system-string-cannot-be-serialized-error-in-/syncOnlyで説明されているようにコマンドラインに追加すると、エラーはなくなりますwcf-236.aspx

これにより、Async インターフェイス メンバーが生成されません。

また、非同期メソッドを含めると別のエラーが発生することも確認しました。

IsOneWay=true でマークされた操作は、出力パラメーター、参照渡しパラメーター、または戻り値を宣言してはなりません。

原因は、.NET 4.5 ツールを使用して .NET 4.0 アプリケーションを構築したことにあると思われます。ツールはコードをコンパイルするのではなくコードを生成するため、ツールが対象とする .NET のバージョンは出力に適用されません。次に、.NET 4.0 を対象とするアプリケーションで .NET 4.5 用のコードを使用すると、一部の動作が同期しなくなります。

于 2013-09-04T19:16:44.777 に答える