我有以下代码:
List<Task<bool>> tasks = tasksQuery.ToList();
while (tasks.Any())
{
Task<bool> completedTask = await Task.WhenAny(tasks);
if (await completedTask)
return true;
tasks.Remove(completedTask);
}
Run Code Online (Sandbox Code Playgroud)
它并行启动任务.当第一个完成的任务返回true时,方法返回true.
所有剩余的任务已经启动并且可能仍然在后台运行会发生什么? 这是执行异步,并行和在第一个条件发生后应该返回的代码的正确方法,还是最好逐个启动它们并等待单独进行?
谢谢
我想知道编写异步代码的最佳/正确方法是什么,该异步代码由两个(或更多)异步和依赖(第一个必须完成执行第二个)操作组成.
使用async/await的示例:
await RunFirstOperationAsync();
await RunSecondOperationAsync();
Run Code Online (Sandbox Code Playgroud)
续例示例:
await RunFirstOperationAsync()
.ContinueWith(t => RunSecondOperationAsync());
Run Code Online (Sandbox Code Playgroud) 在我的x64 Windows 8.1笔记本电脑上,几乎所有的.NET CLR性能计数器都丢失了.
任何想法如何解决这一问题?

我们有一个IStringLocazlizer的自定义实现,它从我们内部公司 CMS 加载标签,通过 HTTP Rest 接口公开数据。
我们想使用 locazlier 中内置的 NET Core,但我不喜欢GetAllStrings Sync 方法,该方法必须阻止任务才能执行 HTTP 调用。
我们有一个明显的缓存,但我确实认为它看起来不对。
对此有什么想法吗?
例子:
public IEnumerable<LocalizedString> GetAllStrings(bool includeParentCultures)
{
Task<CmsLabelsModel> task = pipeline.SendAsync(new GetLabelsModelRequest(ResourceName));
CmsLabelsModel result = task.GetAwaiter().GetResult(); //Yuk Yuk
return result.LabelModels.Select(pair => new LocalizedString(pair.Key, pair.Value.Value));
}
Run Code Online (Sandbox Code Playgroud) 我有一个ASP.NET MVC应用程序,其中所有映射都以这种方式在引导期间注册:
Mapper.CreateMap<AdvicesModel, Advices>();
Run Code Online (Sandbox Code Playgroud)
到目前为止,我们静态地使用了它"旧"的方式:
Mapper.Map<Advice>(adviceDto)
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.
更新到AutoMapper的第4版后,我发现建议使用它来构建实例.有人能指出我如何正确地指示Castle将AutoMapper的实例注入我的依赖项并且不是静态地使用它.
我想象的是这样的:
var viewModel = mapper.Map<CartViewModel>(cart);
Run Code Online (Sandbox Code Playgroud)
与IMapper实例注入.
c# ×3
async-await ×2
.net ×1
asp.net ×1
asp.net-core ×1
asp.net-mvc ×1
automapper ×1
clr ×1
windows ×1