1

次の Silverlight コードがあります。

Container container = new Container("http://localhost:8080/odata");
DataServiceQuery dsq = container.MyEntity;
IEnumerable result = Task<IEnumerable>.Factory.FromAsync(dsq.BeginExecute, dsq.EndExecute, null).Result;

私が経験している問題は、dsq.EndExecute呼び出されないことです。Fiddler で HTTP トラフィックを監視したところ、へのリクエストが送信さhttp://localhost:8080/odata/MyEntityれ、以下のレスポンスが受信されました。タスクは、応答が受信されたことを認識していないようです。

HTTP/1.1 200 OK
Server: ASP.NET Development Server/11.0.0.0
Date: Mon, 20 May 2013 15:04:16 GMT
X-AspNet-Version: 4.0.30319
DataServiceVersion: 3.0
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/atom+xml; charset=utf-8
Content-Length: 562
Connection: Close

<?xml version="1.0" encoding="utf-8"?>
<feed xml:base="http://localhost:8080/odata/" xmlns="http://www.w3.org/2005/Atom" 
    xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
    xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" 
    xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">
  <id>http://schemas.datacontract.org/2004/07/</id>
  <title />
  <updated>2013-05-20T15:04:16Z</updated>
  <link rel="self" href="http://localhost:8080/odata/MyEntity" />
  <author>
    <name />
  </author>
</feed>

私は何か間違ったことをしていますか?

4

3 に答える 3

1

一緒に回避するだけで、この問題を回避FromAsync()しました。次のコードは私にとってはうまくいきます。

var result = Task.Factory.StartNew(() => dsq.BeginExecute(null, null))
    .ContinueWith(t => dsq.EndExecute(t.Result)).Result;
于 2013-05-23T13:39:31.543 に答える
1

電話しないでくださいResultawait代わりに結果が必要です。多くの場合、ResultGUI アプリケーション (Silverlight を含む) がデッドロックします。

このデッドロックについては、ブログMSDN の記事で詳しく説明しています。

于 2013-05-21T21:42:47.707 に答える
0

async/await を追加してみましたか?

public async void foo()
{
   IEnumerable result = await Task<IEnumerable>.Factory.FromAsync(
      dsq.BeginExecute, dsq.EndExecute, null);
}   
于 2013-05-21T20:51:18.890 に答える