由於某些原因,我需要返回.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庫:
現在在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);
}
});
}
似乎我們無法在Client.Instance .____客戶端看到最相關的代碼,這是來自生成的客戶端界面嗎? –
這是一個與wcf服務交互的客戶端對象的單例模式。 Client.Instance.ClientObjectName.SomeMethod(); – ShadyOverflow
不過,這是問題所在。 –