[英]Convert existing C# synchronous method to asynchronous with async/await?
[英]How to convert method to async / await C#
嗨,我的 C# Web 服务中有以下方法:
[WebMethod(EnableSession = true)]
//[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
public object[] GetChartData()
{
System.Threading.Thread.Sleep(5000);
string graphData = "";
List<GoogleChartData> data = new List<GoogleChartData>();
using (DBContext context = new DBContext ())
{
data = context.Campaings.AsNoTracking().Take(10).Select(c => new GoogleChartData
{
Year = 2015,
USA = 1,
Mexico = 2,
Canada = 3
}).ToList();
}
var chartData = new object[data.Count + 1];
chartData[0] = new object[]{
"Year",
"USA",
"Mexico",
"Canada"
};
Random random = new Random();
int j = 0;
foreach (var i in data)
{
j++;
chartData[j] = new object[] { i.Year.ToString(), random.Next(0, 1000), random.Next(0, 1000), random.Next(0, 1000) };
}
return chartData;
}
多次从同一个应用程序调用时遇到问题,所以我想让它异步。 我是异步/等待的新手。
有什么线索吗?
我不太清楚你想要什么,但如果你想在你的函数中使用Await/Async
,这是你的线索(假设你使用的是Entity Framework 6
):
public async Task<object[]> GetChartData()
{
List<GoogleChartData> data;
using (DBContext context = new DBContext ())
{
data = await context.Campaings.AsNoTracking().Take(10).Select(c => new GoogleChartData
{
Year = 2015,
USA = 1,
Mexico = 2,
Canada = 3
}).ToListAsync(); // Use ToListAsync()
}
// The rest are the same
}
编辑!!!
正如VAAA
在评论中所说, ToListAsync()
在他的情况下不可用,所以我尝试找到另一种解决方案。
感谢Scott Chamberlain
在他的评论中的想法,解决方案是:使用来自调用者的Task.Run(() => GetChartData())
。
对于那些谁是打算使用Task.Run()
内GetChartData()
我们不应该作出同步异步代码封装。
[WemMethod]
public async Task<List<ErrorLog>> GetAllErrorLogs()
{
List<ErrorLog> errorLogs = new List<ErrorLog>();
await System.Threading.Tasks.Task.Run(() => {
errorLogs = ErrorLogRepository.GetAllErrorLogs();
})
if (errorLogs == null)
return new List<ErrorLog>();
return errorLogs;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.