ASP NET MVC 5任务异步创建异步方法

时间:2014-06-12 17:44:46

标签: c# asp.net .net asp.net-mvc asynchronous

所以我只想制作服务图层async

我有一个新服务ProjectManagement,我希望它的GetProjects方法是异步的。

public Task<string> GetProjectsAsync()
{
    var json = JsonConvert.SerializeObject(_repository.All<Projects>());

    return json;
}

我知道这种方法不起作用,显然是因为我返回一个字符串,而不是Task<string>。那么如何使用Task.Run()运行此方法并返回结果?

我看过这个documentation,我对如何使用它有点困惑?

我想在控制器中做的就是:

var jsonData = await _projectManagement.GetProjectsAsync();

2 个答案:

答案 0 :(得分:5)

转换为async时,您希望从&#34;离开&#34;并努力实现您的控制器/ UI。我做了很多转换,这是我发现的最佳方法。

因此,首先要确定任何自然异步的操作;任何I / O限制都是一个不错的选择。您已经确定了一个:数据库调用。

接下来,从最低级别的代码开始,并使其异步。这就是你的问题所在;您正在考虑使用Task.Run强制中间异步,但您需要深入到较低级别并使其一直异步。

例如,我假设您的存储库正在使用Entity Framework,并且您的All<T>方法看起来像这样:

public List<T> All<T>()
{
  return _context.Set<T>().ToList();
}

然后,您将开始创建此存储库方法的异步版本:

public Task<List<T>> AllAsync<T>()
{
  return _context.Set<T>().ToListAsync();
}

一旦你有至少一个异步存储库方法,你可以开始将服务层更改为异步,所以这段代码:

public string GetProjects()
{
  var json = JsonConvert.SerializeObject(_repository.All<Projects>());
  return json;
}

成为这个:

public async Task<string> GetProjectsAsync()
{
  var json = JsonConvert.SerializeObject(await _repository.AllAsync<Projects>());
  return json;
}

一旦服务层是异步的,您就可以将控制器更改为异步。

答案 1 :(得分:-3)

您应该尝试此链接http://www.dotnetperls.com/async

private async void DoAsyncWork()
{ 
   var data = await GetProjectAsync();
}

async Task<string> GetProjectAsynce()
{
    // code to get stuff done
    // await key word may be needed depending on
    // what you are doinf
    return JsonConvert.SerializeObject(myRepository.All<Projects>());
    // convert to string first of course 
}