我定義了如下接口引出錯誤:
public interface INewsCategoryRepository { void CreateNewsCategory(NewsCategory newsCategory); }
然后用如下類實現了上述接口
public async void CreateNewsCategory(NewsCategory newsCategory)
{ var db = dbContext as NewsEFCoreContext; await db.Categories.AddAsync(newsCategory); }
於是問題出現了:
public class AddNewsCategoryUseCase { private readonly IRepository repository; private readonly INewsCategoryRepository newsCategoryRepository; public AddNewsCategoryUseCase(IRepository argRepository, INewsCategoryRepository argNewsCategoryRepository) { this.repository = argRepository; this.newsCategoryRepository = argNewsCategoryRepository; } /// <summary> /// 添加新的新聞 /// </summary> /// <param name="addNewsCategoryDto"></param> public async void AddNewsCategory(AddNewsCategoryDto addNewsCategoryDto) { NewsCategory newsCategory = addNewsCategoryDto.ToNewsCategory(); try { using (repository) { //newsCategoryRepository 是接口成員 其返回類型是void 沒辦法使用await--------------------------!!! await newsCategoryRepository.CreateNewsCategory(newsCategory); repository.Commit(); } } catch (Exception ex) { throw ex; } } }
截圖如下:

正確的辦法應該是:不能將接口方法定義為void 而應該定義為Task。(沒有返回值就用Task,有返回值就用Task<T>)
public interface INewsCategoryRepository { Task CreateNewsCategory(NewsCategory newsCategory); }
實現類如下:
public async Task CreateNewsCategory(NewsCategory newsCategory) { var db = dbContext as NewsEFCoreContext; await db.Categories.AddAsync(newsCategory); }
調用這個方法如下:
public class AddNewsCategoryUseCase { private readonly IRepository repository; private readonly INewsCategoryRepository newsCategoryRepository; public AddNewsCategoryUseCase(IRepository argRepository, INewsCategoryRepository argNewsCategoryRepository) { this.repository = argRepository; this.newsCategoryRepository = argNewsCategoryRepository; } /// <summary> /// 添加新的新聞 /// </summary> /// <param name="addNewsCategoryDto"></param> public async Task AddNewsCategory(AddNewsCategoryDto addNewsCategoryDto) { NewsCategory newsCategory = addNewsCategoryDto.ToNewsCategory(); try { using (repository) { //沒問題------------------!!! await newsCategoryRepository.CreateNewsCategory(newsCategory); repository.Commit(); } } catch (Exception ex) { throw ex; } } }
截圖:

參考文章:異步編程中的最佳做法 https://msdn.microsoft.com/zh-cn/magazine/jj991977.aspx?f=255&MSPPError=-2147217396
