繁体   English   中英

如何将方法转换为异步/等待 C#

[英]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()我们应该作出同步异步代码封装

看看创建一个异步 web 服务方法

[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM