小编Sha*_*sky的帖子

syslog中的多行日志记录

所以我已经配置我的Python应用程序使用Python的SysLogHandler登录到syslog,一切正常.除了多线处理.并不是说我需要如此糟糕地发出多行日志记录(我做了一点),但我需要能够阅读Python的异常.我正在使用Ubuntu和rsyslog 4.2.0.这就是我得到的:

Mar 28 20:11:59 telemachos root: ERROR 'EXCEPTION'#012Traceback (most recent call last):#012  File "./test.py", line 22, in <module>#012    foo()#012  File "./test.py", line 13, in foo#012    bar()#012  File "./test.py", line 16, in bar#012    bla()#012  File "./test.py", line 19, in bla#012    raise Exception("EXCEPTION!")#012Exception: EXCEPTION!
Run Code Online (Sandbox Code Playgroud)

测试代码,以备不时之需:

import logging
from logging.handlers import SysLogHandler

logger = logging.getLogger()
logger.setLevel(logging.INFO)
syslog = SysLogHandler(address='/dev/log', facility='local0')
formatter = logging.Formatter('%(name)s: %(levelname)s %(message)r')
syslog.setFormatter(formatter)
logger.addHandler(syslog)

def foo():
    bar()

def bar():
    bla()

def bla():
    raise Exception("EXCEPTION!")

try:
    foo()
except:
    logger.exception("EXCEPTION")
Run Code Online (Sandbox Code Playgroud)

python logging syslog rsyslog

36
推荐指数
2
解决办法
2万
查看次数

异步库最佳实践:ConfigureAwait(false)与设置同步上下文

众所周知,在通用库中,ConfigureAwait(false)应该在每次await调用时使用,以避免继续当前的SynchronizationContext.

作为使用整个代码库的替代方法ConfigureAwait(false),可以在公共表面方法中将SynchronizationContext设置为null一次,并在返回给用户之前将其恢复.换一种说法:

public async Task SomeSurfaceMethod()
{
    var callerSyncCtx = SynchronizationContext.Current;
    SynchronizationContext.SetSynchronizationContext(null);
    try
    {
        // Do work
    }
    finally
    {
        SynchronizationContext.SetSynchronizationContext(callerSyncCtx);
    }
}
Run Code Online (Sandbox Code Playgroud)

这也可以包含在内以using获得更好的可读性.

这种方法是否有缺点,它最终不会产生相同的效果吗?

主要优点显然是可读性 - 删除所有ConfigureAwait(false)呼叫.它还可以降低忘记ConfigureAwait(false)某个地方的可能性(尽管分析人员可以减轻这种情况,并且可以说开发人员也可以忘记更改SynchronizationContext).

一个有点奇特的优点是没有嵌入在所有方法中捕获SynchronizationContext的选择.换句话说,在一种情况下,我可能想要使用SynchronizationContext运行方法X,而在另一种情况下,我可能想要运行相同的方法而没有一个.何时ConfigureAwait(false)嵌入到不可能的地方.当然,这是一个非常罕见的要求,但我在处理Npgsql时遇到了这个问题(触发了这个问题).

c# asynchronous async-await

14
推荐指数
1
解决办法
1118
查看次数

缺少"BuiltProjectOutputGroupDependencies"构建VSIX取决于新的简化csproj

我有一个标准的VSIX项目,它在同一个解决方案中依赖于类库项目.在将类库转换为新的VS2017RC简化版csproj之前,一切正常.类库构建正常(我的dotnet SDK是1.0.0-preview4-004233),但在尝试构建VSIX时我得到:

error MSB4057: The target "BuiltProjectOutputGroupDependencies" does not exist in the project.
Run Code Online (Sandbox Code Playgroud)

这显然与传统的VSIX csproj不兼容,期望新csproj无法提供的依赖项目.

有没有人碰到这个或有任何关于解决它的建议?我将研究删除项目引用并手动引用输出DLL.

作为一个相关的注释,目前还不清楚VSIX会从类库中选择哪个输出DLL,因为新的csproj支持多个目标框架.

msbuild csproj vsix visual-studio-2017

8
推荐指数
1
解决办法
467
查看次数

使用ExecuteScalar插入时,使用Npgsql检索序列ID

我试图在一个带有串行主键的PostgreSQL表中插入一行,我需要在插入后检索该列.我有这样的事情:

表"pais"有3列:id,pais,capital; id是一个串行列,是它的主键.

NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital)", conn);
query.Parameters.Add(new NpgsqlParameter("nombre", NpgsqlDbType.Varchar));
query.Parameters.Add(new NpgsqlParameter("capital", NpgsqlDbType.Varchar));
query.Prepare();
query.Parameters[0].Value = this.textBox1.Text;
query.Parameters[1].Value = this.textBox2.Text;
Object res = query.ExecuteScalar();
Console.WriteLine(res);
Run Code Online (Sandbox Code Playgroud)

它在表上插入行,但"res"值为null.如果我使用nexval('table_sequence')插入也返回null.

知道怎样才能返回表的id?我错过了什么吗?

提前致谢

.net c# npgsql

7
推荐指数
3
解决办法
1万
查看次数

nuget.exe安装不更新packages.config(或.csproj)?

在尝试使用Linux/mono上的nuget构建工作流时,我注意到了一件奇怪的事情.

在Linux上,我不能使用nuget Visual Studio插件或Powershell控制台,但我有nuget.exe命令行实用程序.该实用程序有一个"安装"命令,可以正确获取包并将它们放在我的包目录中.

但是,nuget.exe的安装(与Visual Studio安装相反)似乎不会使用它添加的包更新packages.config,也不会将项目引用添加到我的.csproj.后者不太重要(我可以手动完成),因为packages.config需要包含递归依赖,我不能手动执行...

有没有其他人试图仅使用nuget.exe安装新软件包或对此有任何见解?我完全吠叫了错误的树吗?

c# mono nuget

7
推荐指数
1
解决办法
2490
查看次数

在 C# 中一般访问多维数组

C# 允许创建和填充多维数组,这是一个简单的例子:

    public static void Main(String[] args)
    {
        var arr = (int[,])CreateArray(new [] {2, 3}, 8);
        Console.WriteLine("Value: " + arr[0,0]);
    }

    // Creates a multidimensional array with the given dimensions, and assigns the
    // given x to the first array element
    public static Array CreateArray<T>(int[] dimLengths, T x)
    {
        var arr = Array.CreateInstance(typeof(T), dimLengths);
        var indices = new int[dimLengths.Length];
        for (var i = 0; i < indices.Length; i++)
            indices[i] = 0;
        arr.SetValue(x, indices);  // Does boxing/unboxing
        return arr;
    }
Run Code Online (Sandbox Code Playgroud)

这很好用。但是,由于某种原因,没有 …

c# arrays generics

5
推荐指数
1
解决办法
500
查看次数

打开 XML Excel。创建文件后无法打开打印对话框。文件已冻结行

我希望有人遇到过这个问题并有解决方案。

我能够利用该DocumentFormat.OpenXml.dll库成功创建一个 Excel 文件。

问题是,如果我的代码冻结了前 x 行,稍后当我在 Excel 中打开文档并尝试使用“打印”对话框时,我会看到其中一个“Microsoft Excel 已停止工作”对话框。

如果我解冻行,保存文件并重新打开它,打印对话框工作正常。我什至可以手动冻结行,保存文件并在 Excel 中打开它;打印对话框工作正常。

我什至在 OpenXML Productivity 工具中打开了这两个文件,两者的代码看起来都一样。

所以我正在做的事情一定有其他问题。

如果有帮助,这里是做所有事情的功能。样式表和数据表在其他地方填充:

public void CreateSpreadsheetWorkbook ( string filepath, List<string []> dataList, List<string> excelHeader )
{
    SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create ( filepath, SpreadsheetDocumentType.Workbook );    // Create a spreadsheet document by supplying the filepath.By default, AutoSave = true, Editable = true, and Type = xlsx.

    WorkbookPart            workbookpart        = spreadsheetDocument.AddWorkbookPart ();                                        // Add a WorkbookPart to the document.
    workbookpart.Workbook = new Workbook (); …
Run Code Online (Sandbox Code Playgroud)

c# openxml

5
推荐指数
1
解决办法
610
查看次数

使用新的csproj在PDB中嵌入C#源代码

最近发布的.NET工具似乎支持在PDB中嵌入C#,这可以改善步入第三方等的体验.运行时csc /?,我可以清楚地看到/ embed选项:"在PDB中嵌入所有源文件".

但是,似乎没有任何方法可以在csproj中指定它.更重要的是,似乎没有任何规定将任意开关传递给编译器,我将用它来手动传递/嵌入.

任何人都可以确认我没有错过任何内容,并且目前缺乏对/ embed的构建支持吗?这是否存在问题(如果没有问题)?任何建议的解决方法也将受到赞赏.

.net c# msbuild csproj roslyn

5
推荐指数
2
解决办法
1674
查看次数

Interlocked.Exchange <T>比Interlocked.CompareExchange <T>慢?

在优化程序时,我遇到了一些奇怪的性能结果,这些结果显示在以下BenchmarkDotNet基准测试中:

string _s, _y = "yo";

[Benchmark]
public void Exchange() => Interlocked.Exchange(ref _s, null);

[Benchmark]
public void CompareExchange() => Interlocked.CompareExchange(ref _s, _y, null);
Run Code Online (Sandbox Code Playgroud)

结果如下:

BenchmarkDotNet=v0.10.10, OS=Windows 10 Redstone 3 [1709, Fall Creators Update] (10.0.16299.192)
Processor=Intel Core i7-6700HQ CPU 2.60GHz (Skylake), ProcessorCount=8
Frequency=2531248 Hz, Resolution=395.0620 ns, Timer=TSC
.NET Core SDK=2.1.4
  [Host]     : .NET Core 2.0.5 (Framework 4.6.26020.03), 64bit RyuJIT
  DefaultJob : .NET Core 2.0.5 (Framework 4.6.26020.03), 64bit RyuJIT

          Method |      Mean |     Error |    StdDev |
---------------- |----------:|----------:|----------:|
        Exchange | 20.525 …
Run Code Online (Sandbox Code Playgroud)

.net c# interlocked compare-and-swap .net-core

5
推荐指数
1
解决办法
191
查看次数

PostgreSQL 和实体框架的超时问题

当我尝试EntityFramework6.Npgsql使用以下代码查询 PostgreSQL 数据库时:

using (MyDbContext context = new MyDbContext())
{
   var res = (from b in context.mytable select new { b.Name, b.Age }); 
   foreach (var row in res)
   {
      Console.WriteLine(row.Name + " - " + row.Age);
   }
}
Run Code Online (Sandbox Code Playgroud)

获取几行后出现超时异常,并显示以下错误:

[Npgsql.NpgsqlException]:{“57014:由于语句超时而取消语句”}

消息:57014:由于语句超时而取消语句

当我在将所有数据提取到列表时执行相同的操作时,代码工作正常:

using (MyDbContext context = new MyDbContext())
{
   var res = (from b in context.mytable select new { b.Name, b.Age }).ToList(); 
   foreach (var row in res)
   {
      Console.WriteLine(row.Name + " - " + row.Age);
   }
}
Run Code Online (Sandbox Code Playgroud)

我怀疑它与 …

c# linq postgresql entity-framework npgsql

3
推荐指数
1
解决办法
3736
查看次数

C#闭包堆分配在方法开始时发生

我似乎遇到了C#编译器的一些奇怪行为.

请考虑以下代码示例:

static void Main(string[] args)
{
    Foo(false, 8);
}

public static void Foo(bool execute, int x)
{
    if (execute)
    {
        Task.Run(() => Console.WriteLine(x));
    }
}
Run Code Online (Sandbox Code Playgroud)

运行此(在发布中)显示发生了一些意外的分配.检查IL表明闭包触发的堆分配出现在函数的最开头,而不是在条件内:

  .method public hidebysig static void 
    Foo(
      bool execute, 
      int32 x
    ) cil managed 
  {
    .maxstack 2
    .locals init (
      [0] class Test.Program/'<>c__DisplayClass1_0' 'CS$<>8__locals0'
    )

    IL_0000: newobj       instance void Test.Program/'<>c__DisplayClass1_0'::.ctor()
    IL_0005: stloc.0      // 'CS$<>8__locals0'
    IL_0006: ldloc.0      // 'CS$<>8__locals0'
    IL_0007: ldarg.1      // x
    IL_0008: stfld        int32 Test.Program/'<>c__DisplayClass1_0'::x

    // [18 13 - 18 25]
    IL_000d: ldarg.0 …
Run Code Online (Sandbox Code Playgroud)

.net c# closures roslyn

3
推荐指数
1
解决办法
440
查看次数

C# 中的超高效 UTF8 字节编码

我试图在一个需要将 C# 字符串发送到某个地方之前将其转换为 byte[] 的库中实现最大性能。

由于 UTF8 中的 char 最多占用 4 个字节,因此我当前的方法是预分配一个大的 byte[]。当字符串到达​​进行编码时,我可以使用System.Text.Encoder用它填充字节数组。如果字符串的 char length * 4 大于我的缓冲区,我会分配一个新的(通过缓冲池优化),但这应该很快就会变得相对罕见。

我对这个解决方案的唯一问题是 System.Text.Encoder 似乎不接受字符串 - 只接受 char[]。从字符串中检索 char[] 涉及另一个看似不必要的副本。有一个带有 char 指针的不安全版本,但目前禁止我在我的库中使用它。

附带说明一下,StringWriter 也进行 UTF8 转换,并维护一个内部缓冲区。这又是不合适的 - 我需要自己的缓冲区,因为我也编码其他数据类型(例如整数)。

那么有人知道 Encoder 不提供直接作用于 String 的方法吗?

c# optimization encoding utf-8

2
推荐指数
1
解决办法
4684
查看次数

Java方法重载:参数的顺序是否会影响延迟?

假设我使用方法X跟随A类.我可以通过以下两种方式重载方法.

A{
  void X(foo p, bar q);
  void X(foo p, baq q);
}

A{
  void X(foo p, bar q);
  void X(baq q, foo p);
}
Run Code Online (Sandbox Code Playgroud)

第二个实现是否应该首选,因为它需要更少的时间来解决并找到正确的功能?

如果需要进一步澄清,请与我们联系.

java optimization overloading

-1
推荐指数
1
解决办法
165
查看次数