所以我已经配置我的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) 众所周知,在通用库中,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时遇到了这个问题(触发了这个问题).
我有一个标准的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支持多个目标框架.
我试图在一个带有串行主键的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?我错过了什么吗?
提前致谢
在尝试使用Linux/mono上的nuget构建工作流时,我注意到了一件奇怪的事情.
在Linux上,我不能使用nuget Visual Studio插件或Powershell控制台,但我有nuget.exe命令行实用程序.该实用程序有一个"安装"命令,可以正确获取包并将它们放在我的包目录中.
但是,nuget.exe的安装(与Visual Studio安装相反)似乎不会使用它添加的包更新packages.config,也不会将项目引用添加到我的.csproj.后者不太重要(我可以手动完成),因为packages.config需要包含递归依赖,我不能手动执行...
有没有其他人试图仅使用nuget.exe安装新软件包或对此有任何见解?我完全吠叫了错误的树吗?
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)
这很好用。但是,由于某种原因,没有 …
我希望有人遇到过这个问题并有解决方案。
我能够利用该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) 最近发布的.NET工具似乎支持在PDB中嵌入C#,这可以改善步入第三方等的体验.运行时csc /?,我可以清楚地看到/ embed选项:"在PDB中嵌入所有源文件".
但是,似乎没有任何方法可以在csproj中指定它.更重要的是,似乎没有任何规定将任意开关传递给编译器,我将用它来手动传递/嵌入.
任何人都可以确认我没有错过任何内容,并且目前缺乏对/ embed的构建支持吗?这是否存在问题(如果没有问题)?任何建议的解决方法也将受到赞赏.
在优化程序时,我遇到了一些奇怪的性能结果,这些结果显示在以下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) 当我尝试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#编译器的一些奇怪行为.
请考虑以下代码示例:
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) 我试图在一个需要将 C# 字符串发送到某个地方之前将其转换为 byte[] 的库中实现最大性能。
由于 UTF8 中的 char 最多占用 4 个字节,因此我当前的方法是预分配一个大的 byte[]。当字符串到达进行编码时,我可以使用System.Text.Encoder用它填充字节数组。如果字符串的 char length * 4 大于我的缓冲区,我会分配一个新的(通过缓冲池优化),但这应该很快就会变得相对罕见。
我对这个解决方案的唯一问题是 System.Text.Encoder 似乎不接受字符串 - 只接受 char[]。从字符串中检索 char[] 涉及另一个看似不必要的副本。有一个带有 char 指针的不安全版本,但目前禁止我在我的库中使用它。
附带说明一下,StringWriter 也进行 UTF8 转换,并维护一个内部缓冲区。这又是不合适的 - 我需要自己的缓冲区,因为我也编码其他数据类型(例如整数)。
那么有人知道 Encoder 不提供直接作用于 String 的方法吗?
假设我使用方法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)
第二个实现是否应该首选,因为它需要更少的时间来解决并找到正确的功能?
如果需要进一步澄清,请与我们联系.
c# ×10
.net ×4
csproj ×2
msbuild ×2
npgsql ×2
optimization ×2
roslyn ×2
.net-core ×1
arrays ×1
async-await ×1
asynchronous ×1
closures ×1
encoding ×1
generics ×1
interlocked ×1
java ×1
linq ×1
logging ×1
mono ×1
nuget ×1
openxml ×1
overloading ×1
postgresql ×1
python ×1
rsyslog ×1
syslog ×1
utf-8 ×1
vsix ×1