2016-11-14 33 views
2

由於某些原因,我需要返回.net版本,所以我是4.5,現在是IM 4.0,並且與我的異步方法有衝突: 我有wcf服務,我想執行異步方法,並等待着他們,所以在4.5我這樣做: WCF:如何在.NET 4.0中正確使用async/await

public async Task<DataTable> ProcessSomething(string Param1, int Param2) 
     { 
      return await Task.Run(() => 
      { 
      return new DataTable("aaa"); 
      }); 
     } 

和4.5客戶端:

private static async Task<bool> ProcessSomethingAsync(string Param1, int Param2) 
     { 
      decimal payin = 0; 
      Task<DataTable> result = Client.Instance.___Client.ProcessSomethingAsync(Param1, Param2); 
      if (result == await Task.WhenAny(result, Task.Delay(1000))) 
      { 
       //code here.. 
      } 
     } 

但是當我恢復到4.0,這兩個,服務和客戶,我不得不使用nuget庫:

https://www.nuget.org/packages/Microsoft.Bcl.Async/

現在在WCF 4.0我有這樣的:

public async Task<DataTable> ProcessSomething(string Param1, int Param2) 
     { 
      return await Task.Factory.StartNew(() => 
      { 
       return new DataTable("aaa"); 
      }); 
     } 

,並在客戶端我試試這個:

DataTable ProcessSomethingResult = await Client.Instance.____Client.ProcessSomethingAsync(Param1, Param2); 

但錯誤彈出說:不能等待無效... 如果我打電話:

DataTable ProcessSomethingResult = Client.Instance.____Client.ProcessSomething(Param1, Param2); 

它返回datatable沒問題......但異步返回void ..爲什麼?如何解決這個... TNX提前..

//在評論你問我的一些過程的定義,那就是:

public async Task<DataTable> ProcessTicket(string Barcode, int ClientID) 
     { 
      return await Task.Factory.StartNew(() => 
      { 
       try 
       { 
        DataTable dt = new DataTable("ProcessTicket"); 
        using (SqlConnection con = new SqlConnection(TempClass._DatabaseConnectionString)) 
        { 
         using (SqlCommand com = new SqlCommand("SELECT * FROM dbo.ProcessTicket(@Barcode, @ClientID)", con)) 
         { 
          con.Open(); 
          com.CommandType = CommandType.Text; 
          com.Parameters.AddWithValue("@Barcode", Barcode); 
          com.Parameters.AddWithValue("@ClientID", ClientID); 
          dt.Load(com.ExecuteReader()); 
          if (dt == null) 
           throw new FaultException("DataTable from database is null."); 
          return dt; 
         } 
        } 
       } 
       catch (Exception ex) 
       { 
        Logs.Instance.AppendLogs(ex.Message, MethodBase.GetCurrentMethod().Name); 
        throw new FaultException(ex.Message); 
       } 
      }); 
     } 
+0

似乎我們無法在Client.Instance .____客戶端看到最相關的代碼,這是來自生成的客戶端界面嗎? –

+0

這是一個與wcf服務交互的客戶端對象的單例模式。 Client.Instance.ClientObjectName.SomeMethod(); – ShadyOverflow

+0

不過,這是問題所在。 –

回答

1

在舊版本的WCF異步的與開始/結束語句綁定的函數。使用基於任務的異步代理可能會導致您正在運行的問題。

重新生成您的客戶端代理,以便您擁有開始/結束連擊並使用TaskFactory.FromAsync將其轉換爲可以使用Microsoft.Bcl.Async等待的任務。

//put this in a seperate file, client proxies are usually marked "partial" so you can 
// add functions on like this and not have them erased when you regenerate. 
partial class YourClientProxy 
{ 
    public Task<DataTable> ProcessSomethingAsync(string Param1, int Param2) 
    { 
     return Task<DataTable>.Factory.FromAsync(this.BeginProcessSomething, this.EndProcessSomething, Param1, Param2, null); 
    } 
} 
+0

謝謝先生,使命完成:) – ShadyOverflow

+0

@ Srgjan-LDTeam您應該點擊答案旁邊的複選標記標記答案。 –

+0

完成:)............. – ShadyOverflow

相關問題