gpt4 book ai didi

c# - 如何在 .NET 4.0 中正确使用 async/await

转载 作者:行者123 更新时间:2023-11-30 23:18:52 25 4
gpt4 key购买 nike

出于某些原因,我需要回到 .net 版本,所以我是 4.5,现在我是 4.0,我与我的异步方法有冲突:我有 wcf 服务,我想执行异步方法并等待它们,所以在 4.5 中我这样做了:wcf:

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);

但弹出错误提示:无法等待 void...如果我打电话:

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

它返回数据表没有问题...但是异步返回 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);
}
});
}

最佳答案

在旧版本的 WCF 中,异步函数绑定(bind)到 Begin/End 语句。使用基于任务的异步代理可能会导致您遇到的问题。

重新生成您的客户端代理,以便您拥有开始/结束组合并使用 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);
}
}

关于c# - 如何在 .NET 4.0 中正确使用 async/await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40587312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com