我正在更新具有在.NET 3.5中构建的API表面的库.因此,所有方法都是同步的.我无法更改API(即,将返回值转换为Task),因为这将要求所有调用者都更改.所以我留下了如何以同步方式最好地调用异步方法.这是在ASP.NET 4,ASP.NET Core和.NET/.NET Core控制台应用程序的上下文中.
我可能不够清楚 - 情况是我现有的代码不是异步识别的,我想使用新的库,如System.Net.Http和仅支持异步方法的AWS SDK.所以我需要缩小差距,并且能够拥有可以同步调用的代码,然后可以在其他地方调用异步方法.
我已经做了很多阅读,并且有很多次这已经被问及并回答了.
问题是大多数答案都不同!我见过的最常见的方法是使用.Result,但这可能会死锁.我已经尝试了以下所有内容,并且它们可以工作,但我不确定哪种方法可以避免死锁,具有良好的性能,并且可以很好地运行运行时(在尊重任务调度程序,任务创建选项等方面) ).有明确的答案吗?什么是最好的方法?
private static T taskSyncRunner<T>(Func<Task<T>> task)
{
T result;
// approach 1
result = Task.Run(async () => await task()).ConfigureAwait(false).GetAwaiter().GetResult();
// approach 2
result = Task.Run(task).ConfigureAwait(false).GetAwaiter().GetResult();
// approach 3
result = task().ConfigureAwait(false).GetAwaiter().GetResult();
// approach 4
result = Task.Run(task).Result;
// approach 5
result = Task.Run(task).GetAwaiter().GetResult();
// approach 6
var t = task();
t.RunSynchronously();
result = t.Result;
// approach 7
var t1 = task();
Task.WaitAll(t1); …
Run Code Online (Sandbox Code Playgroud) c# asp.net multithreading asynchronous task-parallel-library
是否可以将PowerShell脚本作为git钩子运行?
我在PowerShell提示符下运行git,这应该没什么区别,但是我似乎无法让它们工作,因为钩子的命名没有扩展,而PowerShell需要(AFAIK).ps1扩展名.我不确定这是问题还是其他问题.
谢谢,埃里克
我在项目中使用新的Web API位,我发现我无法正常使用HttpMessageRequest
,因为我需要将客户端证书添加到请求中.结果,我正在使用HttpClient
(所以我可以使用WebRequestHandler
).这一切都很好,除了它不是存根/模拟友好,至少对于Rhino Mocks.
我通常会创建一个HttpClient
我将使用的包装器服务,但我想尽可能避免这种情况,因为我需要包装很多方法.我希望我遗漏了一些东西 - 关于如何存根的任何建议HttpClient
?
我正在使用Azure表存储的系统.在其他系统中(例如,SQL,基于文件等),我可以写一个假的,允许我测试我的数据持久性逻辑.但是,我看不到为Azure表服务创建虚假的简单方法.
我可以创建一个行为方式相同的新IIS项目,但这不是编写单元测试的好方法,它更像是一个集成测试.
有关如何对使用Azure Table Storage客户端的数据访问代码进行单元测试的任何想法?
在Visual Studio 2012中从代码文件切换到XAML文件时,重点放在设计器上.如果我想编辑XAML(99%的时间),我需要使用鼠标将焦点移动到XAML代码/标记窗口.有没有办法在没有鼠标的情况下将焦点移动到XAML?
注意:在SO中也有类似的问题,但它们涉及在代码背后和XAML设计器之间移动.
我正在使用NEST库与ElasticSearch进行交互,我正试图找出一种基于非类型数据构建索引类型/嵌套对象的方法.该类型具有以下基本结构.
public class Entity : DynamicObject
{
public string Id { get; set; }
// a bunch of other simple properties
public override IEnumerable<string> GetDynamicMemberNames()
{
return Data.Select(x => x.Name);
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var dictionary = Data.First(x => x.Name == binder.Name);
result = dictionary;
return true;
}
// each instance of one these should be a nested object type
public IList<NestedType> Data { get; set; }
public class NestedType
{
// How do …
Run Code Online (Sandbox Code Playgroud) 我现在一直在使用Rx在一个应用程序中创建一个事件总线(想想CQRS/ES),它看起来效果很好.然而,在调查了一堆不同的Event Sourcing框架之后,我还没有看到Rx使用过一次.与基于反射/容器的调度程序相比,它看起来非常合适,但也许有一些我缺少的东西.我宁愿不花一大堆时间在一个有3个月的停顿的东西上.是不是有理由说Rx不合适?
谢谢,埃里克
我有一个相当大的解决方案,混合使用程序集和ASP.NET网站(没有csproj文件的那些).我正在尝试从命令行自定义构建,因此我需要了解MSBuild究竟在做什么.
当MSBuild构建.sln文件时,我看到它创建了metaproj文件(我假设它是MSBuild文件).但是,它们似乎永远不会出现在文件系统上.我假设MSBuild以某种方式隐藏它们.有没有办法可以查看这些文件?
我正在编写一个通过WCF公开服务的应用程序.该服务是自托管的(控制台应用程序),需要使用Singleton实例.我试图弄清楚如何在服务配置中指定单例,而不使用服务实现上的属性.是否可以在没有属性的代码中指定单例?
谢谢,埃里克
我一直在研究Azure服务总线队列(非 Azure存储队列).我读过的所有细节都表明它支持FIFO语义,但仅限于"消息传递会话"的上下文.问题是我似乎无法找到有关Azure上下文中究竟是什么的任何信息.这是一个WCF构造,还是特定于Azure Service Bus的东西?我认为它与本地交易无关,但我并非百分之百确定.
任何指针都会非常有用.谢谢!
c# ×3
asp.net ×2
azure ×2
unit-testing ×2
asynchronous ×1
azure-queues ×1
cqrs ×1
git ×1
githooks ×1
msbuild ×1
nest ×1
powershell ×1
rhino-mocks ×1
self-hosting ×1
wcf ×1
wcf-web-api ×1
xaml ×1