我们习惯于通过获取完整版本(例如从已安装的 Office 可执行文件的文件信息)来检测当前安装的 Office 版本,并将市长版本映射到友好名称,例如 15 个映射到“Office 2013”,16 个映射到“Office 2016 年”。
但是Office 2019的主要版本号没有变化,我们得到的版本号是16.0.10827.20138
是否有可靠的方法将次要版本号映射到“Office 2019”?从哪个值开始是 2019 年?是否有其他方法可以检测是否安装了 Office 2019?
“Office 2016”没有更多的小更新了吗?
我在需要使用分布式事务的任何地方实现了 EF 6 执行策略的暂停,以避免“'SqlAzureExecutionStrategy' 不支持用户启动的事务”异常,如下所示:
https://romiller.com/2013/08/19/ef6-suspendable-execution-strategy/ https://msdn.microsoft.com/en-us/library/dn307226(v=vs.113).aspx
但是,最近我在批量数据管理会话期间遇到了两次失败,最终导致了上述异常。
如果我理解正确,给定的示例在全局级别启用/禁用执行策略,这意味着如果在多个线程上同时执行操作,一个操作可以在另一个操作完成之前结束挂起。如果将 .NET 4.6.1 用于跨越多个 SQL Azure DB 的事务,则效果可能最明显,这可能需要一段时间才能完成。
为了避免这种情况,我求助于创建一个全局事务计数器,它以线程安全的方式递增和递减,并且只有在没有待处理的事务时才解除挂起,例如:
public class MyConfiguration : DbConfiguration
{
public MyConfiguration()
{
this.SetExecutionStrategy("System.Data.SqlClient", () => SuspendExecutionStrategy
? (IDbExecutionStrategy)new DefaultExecutionStrategy()
: new SqlAzureExecutionStrategy());
}
public static bool SuspendExecutionStrategy
{
get
{
return (bool?)CallContext.LogicalGetData("SuspendExecutionStrategy") ?? false;
}
set
{
CallContext.LogicalSetData("SuspendExecutionStrategy", value);
}
}
}
Run Code Online (Sandbox Code Playgroud)
进而:
public class ExecutionHelper
{
private static int _pendingTransactions;
public void ExecuteUsingTransaction(Action action)
{
SuspendExeutionStrategy();
try
{
using (var transaction = new TransactionScope())
{ …
Run Code Online (Sandbox Code Playgroud)