小编jdu*_*tor的帖子

当Action重载可用时,显式使用Func <Task>进行异步lambda函数

阅读这篇关于C#5 async/await的一些问题的博客文章.它在Gotcha#4中提到了一些非常深刻的东西,而且我以前没想过.

简而言之,它涵盖了一个方法,其中有一个方法有两个重载,一个取一个Action,一个取一个Func<Task>(例如Task.Run).这个问题的根源在于async void方法应该仅用于事件处理程序,然后该帖子继续描述以下场景 - 编译器推断出什么时候像下面这样的lambda函数可以编译为a Func<Task>和a Action:

Task.Run(async () => {
  await Task.Delay(1000);
});
Run Code Online (Sandbox Code Playgroud)

由于Task.Run既有的签名Task.Run(Func<Task>)Task.Run(Action),是什么类型编译异步匿名函数?一个async void还是一个Func<Task>?我的直觉是它会编译成async void纯粹因为它是非泛型类型,但C#编译器可能很聪明并且给出了Func<Task>类型偏好.

另外,有没有办法明确声明我希望使用哪个重载?我知道我可以创建一个新的实例Func<Task>并在那里传递异步lambda函数,但它仍然会编译成a async void然后将其传递给Func<Task>.的构造函数.什么是确保编译为Func<Task>?的理想方法?

c# lambda async-await c#-5.0

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

确定访客是否通过CloudFlare Pro上的SSL连接

我们在CloudFlare Pro上运行一个站点,该站点使用他们提供的证书进行一键加密.我们的网站为用户提供"可选"SSL.由于它是一个论坛,我们目前运行一个代理脚本,用于检测发布的图像是否未使用HTTPS协议,并通过我们服务器上运行的脚本自动代理图像,以保持安全性和我们可爱的绿色锁定!

我现在唯一的问题是,当用户不使用HTTPS时,这会在我们的服务器上引入不必要的负载,因此我们希望能够检测它们是否存在.但是,由于CloudFlare服务器实际上是连接到我们的,无论通过HTTP(因为我们在CloudFlare上使用一键式SSL),我们的PHP脚本始终报告HTTP并且即使用户使用HTTPS也不会代理图像.有没有办法让CloudFlare报告用户正在使用SSL?

php cloudflare

11
推荐指数
1
解决办法
2205
查看次数

括号内的`exit`不会退出脚本

这是一个简单的问题.为什么这不符合我的想法:

(echo "Test 1"; exit) && echo "Test 2"
Run Code Online (Sandbox Code Playgroud)

...要么...

VAR1=1
VAR2=2
[ $VAR1 == $VAR2 ] || (echo '$VAR1 does not equal $VAR2, exiting.'; exit)
echo -e 'Well, I\'m still alive yo!'
Run Code Online (Sandbox Code Playgroud)

尽管有明确的exit命令,运行这两个片段中的任何一个都会导致脚本继续执行.

显然,由于某些原因,括号正在影响命令,我的问题是为什么?

linux bash

9
推荐指数
2
解决办法
877
查看次数

如何以比使用strip_tags函数更安全的方式剥离标签?

当字符串包含'小于'和'大于'符号时,我在使用strip_tags PHP函数时遇到一些问题.例如:

如果我做:

strip_tags("<span>some text <5ml and then >10ml some text </span>");
Run Code Online (Sandbox Code Playgroud)

我去拿:

some text 10ml some text
Run Code Online (Sandbox Code Playgroud)

但是,显然我想得到:

some text <5ml and then >10ml some text
Run Code Online (Sandbox Code Playgroud)

是的我知道我可以使用< 和>,但我没有机会将这些字符转换为HTML实体,因为数据已经存储,如您在我的示例中所见.

我正在寻找的是一种解析HTML的聪明方法,以便只删除实际的HTML标签.

由于TinyMCE用于生成该数据,我知道在任何情况下都可以使用哪些实际的html标签,因此strip_tags($string, $black_list)实现将比实现更有用strip_tags($string, $allowable_tags).

有没有?

php dom html-parsing strip-tags

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

线路端点检测

我打算在C#中检测从字符(OCR)生成的行的端点.我想要这样的东西:

在此输入图像描述

我的意思是"终点"是我想要得到的任何线路的两端中的人物......例如"C"有两个端点(一个在顶部,一个在底部)为代表的上述图所示作为红色像素.我可以从"更胖"的现有扫描字符中提取单行,我可以进行边缘检测和Flood-fill分析,但我似乎无法复制上面的内容!任何指向文章或现有代码的指针都将非常感谢!任何代码示例都可以,因为我可以轻松地将C++或任何.NET语言转换为C#.

谢谢,乔希

c# ocr line detection endpoint

6
推荐指数
1
解决办法
665
查看次数

在`for`循环中缓存变量

我一直在阅读关于Javascript性能提升的提示,并且一个提示说要在循环比较器语句中缓存所有变量(不会改变),我想知道这是否也适用于.NET.

假设我有一个简单的for循环,下面哪个会更快或者它们是否相同?

没有缓存:

for (int i = 0; i < someArray.Length; i++)
{

}
Run Code Online (Sandbox Code Playgroud)

使用缓存:

for (int i = 0, count = someArray.Length; i < count; i++)
{

}
Run Code Online (Sandbox Code Playgroud)

根据文章"缓存" Length,在循环中删除一个操作的值,因为与访问对象的成员相比,它更快地访问局部变量.与简单地访问成员相比,它实际上更快地声明局部变量吗?编译器是否接受此操作并自动缓存该值?声明局部变量而不是访问该成员是否有任何负面影响?

虽然速度可能是这里的一个关键因素,但它不是唯一的因素.我的下一个问题可能是哪一个更有效率.哪个使用较少的内存分配?哪个执行较少的堆栈操作?等等...

从评论来看,似乎访问数组的长度非常快.让我们说我用了一个IList<>.缓存值Count是否比每次迭代检索它更快?

c# for-loop

6
推荐指数
1
解决办法
2670
查看次数

提高字符串解析性能

在我们开始之前,我知道"过早优化"一词.但是,以下片段已被证明是可以进行改进的领域.

好的.我们目前有一些网络代码可以使用基于字符串的数据包.我知道使用字符串包是愚蠢的,疯狂的和慢的.遗憾的是,我们对客户端没有任何控制权,因此必须使用字符串.

每个数据包都被终止\0\r\n,我们当前使用StreamReader/Writer从流中读取单个数据包.我们的主要瓶颈来自两个地方.

首先:我们需要在字符串末尾修剪那个令人讨厌的小空字节.我们目前使用如下代码:

line = await reader.ReadLineAsync();
line = line.Replace("\0", ""); // PERF this allocates a new string
if (string.IsNullOrWhiteSpace(line))
    return null;
var packet = ClientPacket.Parse(line, cl.Client.RemoteEndPoint);
Run Code Online (Sandbox Code Playgroud)

正如您可以通过那个可爱的小评论看到的那样,我们在修剪'\ 0'时会出现GC性能问题.有许多不同的方法可以修剪一个字符串末尾的'\ 0',但是所有这些都会导致我们获得相同的GC锤击.因为所有字符串操作都是不可变的,所以它们会导致创建一个新的字符串对象.由于我们的服务器处理1000多个连接,所有连接都以每秒25-40个数据包(一个游戏服务器)进行通信,因此这个GC问题正成为一个问题.所以这是我的第一个问题:什么是一种更有效的方法来修剪字符串末尾的'\ 0'?通过高效,我不仅意味着速度,而且还意味着GC明智(最终我想要一种摆脱它而不创建新的字符串对象的方法!).

我们的第二个问题也源于GC土地.我们的代码看起来有点像:

private static string[] emptyStringArray = new string[] { }; // so we dont need to allocate this
public static ClientPacket Parse(string line, EndPoint from)
{
    const char seperator = '|';

    var first_seperator_pos = line.IndexOf(seperator);
    if (first_seperator_pos < 1)
    {
        return new ClientPacket(NetworkStringToClientPacketType(line), emptyStringArray, from);
    } …
Run Code Online (Sandbox Code Playgroud)

c# string performance parsing garbage-collection

6
推荐指数
1
解决办法
882
查看次数

对 .NET 的硬件 AES 支持

这是一个简单的问题。AES 的 .NET 实现是否支持硬件加密/解密?

.net aes hardware-acceleration

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

File.WriteAllBytes不会阻止

我有一段简单的代码:

File.WriteAllBytes(Path.Combine(temp, node.Name), stuffFile.Read(0, node.FileHeader.FileSize));
Run Code Online (Sandbox Code Playgroud)

有人会认为这WriteAllBytes是一个阻塞调用,因为它在C#5.0中有异步对应,并且它没有在任何MSDN文档中说明它是非阻塞的.然而,当一个文件大小合适(不是很大,但在20mb的范围内的某个地方)之后打开文件的调用似乎在写入完成之前调用,并且文件被打开(程序抱怨它已损坏,这是正确的)WriteAllBytes然后抱怨文件在另一个过程中打开.这里发生了什么?!出于好奇的缘故,这是用于打开文件的代码:

System.Diagnostics.Process.Start(Path.Combine(temp, node.Name));
Run Code Online (Sandbox Code Playgroud)

以前有人经历过这种奇怪吗?还是我是一个金发女郎,做错了什么?

如果它确实阻塞了,可能导致这个问题的原因是什么?

编辑:我会完整的方法.

var node = item.Tag as FileNode;
stuffFile.Position = node.FileOffset;
string temp = Path.GetTempPath();
File.WriteAllBytes(Path.Combine(temp, node.Name), stuffFile.Read(0, node.FileHeader.FileSize));
System.Diagnostics.Process.Start(Path.Combine(temp, node.Name));
Run Code Online (Sandbox Code Playgroud)

似乎正在发生的事情是Process.Start被称为BEFORE WriteAllBytes完成,并且它试图打开文件,然后WriteAllBytes抱怨另一个进程持有锁定文件.

.net c# file-io

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

如何从 MySQL 表中删除大数据尖峰

我有一个输入图形的数据库。由于某种原因或其他原因,我的 PHP 脚本时不时地将非常大的峰值插入到我的数据库中......

例如: 截屏

正如您所看到的,图中有随机峰值,其中数据有时从 300 上升到 3000,然后又直接下降到 300。

我需要的是一种整理这些表并删除比前一行和下一行大得多的数据的方法。

我做了一些谷歌研究,但什么也想不出!

提前致谢。

mysql

0
推荐指数
1
解决办法
1548
查看次数