string s1 = "test";
string RuntimeS1 = "test1".Substring(0, 4); // интернирования нет
Console.WriteLine(object.ReferenceEquals(s1, RuntimeS1)); // false, expected
object ObjectCastedRuntimeS1 = RuntimeS1;
Console.WriteLine(ObjectCastedRuntimeS1.Equals(s1)); // true, wat ?!
John's questions
究竟什么应该称为异步方法?应该使用什么标准来调用异步方法?其他术语似乎很清楚,但让我们重复一下,以便我们可以进一步使用它来尝试定义异步方法的概念。
回忆相关概念
有一个异步方法调用(AMI)的概念——
在等待被调用代码完成时调用站点未被阻塞。相反,当回复到达时,调用线程会收到通知。
此外,调用这个词可以更改为调用或执行。
有一个异步的概念,但在编程中它似乎几乎可以与 AMI ( 1 ) 互换使用——
执行一个操作而不等待这个处理完成,执行的结果可以稍后处理。
他们经常举一个例子,用一个烧开的水壶来解释它是什么。
让我们寻找一个异步方法的定义,暂时忘记我们是如何想象它的,以便客观。
- 来源一 - async 关键字的文档-
使用 async 修饰符指定方法、lambda 表达式或匿名方法是异步的。如果在方法或表达式上使用此修饰符,它被称为异步方法。
可以翻译为:如果在方法或表达式中使用此修饰符,则称为异步方法。很明显,并非每个使用异步的方法都必须包含 AMI 或与现实中的异步相关的东西。
- 另一方面,有这样一个来源2:
异步方法是我们调用以启动冗长操作的方法。该方法应该执行启动操作所需的操作并“非常快速地”返回,以便没有处理延迟。
如果您的线程告诉该方法它需要完成工作,并且该方法说“好的,我会这样做,完成后我会打电话给您”,则该方法是异步的
这向我们暗示,在异步方法的定义中应该有一些关于 AMI 的内容,我们在上面回忆过。
- 甚至在旧 Dock 中的同一个 microsoftware 中(在 async 关键字出现之前),您也可以找到该术语的以下用法(3):
如果异步方法遇到未处理的异常,...
所以看起来这样的概念甚至在 async 关键字之前就已经存在,但也许随着它的出现,新的含义出现了纯粹与语言的语法有关。
- ...
不幸的是,研究这些来源需要很长时间,所以我有机会补充那些将回答这个问题的人。
试图从来源中找到定义。
根据所研究的来源,我想到了定义异步方法的哪些选项:
- 这是声明时带有 async 关键字的方法。例子:
async void SimpleAsync() {}
- 它是一种可用于非阻塞调用的方法。例子:
async void DelayAsync() { Task.Delay(1); } //Task.Delay асинхронный, так его можно использовать для AMI. Прям тут и используют.
async void Delay2Async() { await Task.Delay(1); } //Task.Delay асинхронный, так его можно использовать для AMI. Прям тут и используют.
async Task Delay3Async() { await Task.Delay(1); } //Task.Delay асинхронный, так его можно использовать для AMI. Прям тут и используют.
async void DelayExternalAsync() { DelayAsync(); Delay2Async(); } //DelayAsync и Delay2Async асинхронные, так их можно использовать для AMI. Прям тут и используют.
async void DelayExternalAwaitAsync() { await Delay3Async(); } //Delay3Async асинхронный, так его можно использовать для AMI. Прям тут и используют.
//DelayExternalAsync и DelayExternalAwaitAsync асинхронные, так их можно использовать для AMI. Хотя тут их не используют для этого.
async Task<int> JustEmptyAsync() { return await Task.FromResult(1); } // JustEmptyAsync не асинхронный, так его не можно использовать для AMI в других местах, так как внутри ничего асинхронного.
- 它是一种发生非阻塞调用的方法。例子中,几乎所有方法都是异步的,但Task.Delay不是,因为它本身并没有AMI,至少看现有代码(也许不是这样,但我们暂时可以做这样的假设。虽然还有一个问题——有没有可以非阻塞调用的方法,但本身不包含AMI?如果有,那么这里我想用这个方法作为例子,否则这个选项好像是相当于第二个):
async void DelayAsync() { Task.Delay(1); } //DelayAsync асинхронный, так как в нем есть AMI
async void Delay2Async() { await Task.Delay(1); } //Delay2Async асинхронный, так как в нем есть AMI
async Task Delay3Async() { await Task.Delay(1); } //Delay3Async асинхронный, так как в нем есть AMI
async void DelayExternalAsync() { DelayAsync(); } //DelayExternalAsync асинхронный, так как в нем есть AMI
async void DelayExternalAwaitAsync() { await Delay3Async(); } //DelayExternalAwaitAsync асинхронный, так как в нем есть AMI
- 其他选项...
我们强调最初的问题,并用我们在研究资料时学到的东西来补充它
这个概念的起源是什么?它现在有什么意义?还是像许多其他众所周知但没有明确定义的术语一样 - 谁知道他想怎么做?随着时间的推移,是否有多个定义?
这个隔离级别和其他的概念很清楚。如果我们谈论其他级别,那么如何使用锁来实现它们就很清楚了。这里不加深对其他层次的粗略理解:
- Read Uncommited - 在写入后立即完成其操作的每个写入操作添加一个排他锁(无需等待事务结束)
- Read Commited - 在上一级添加共享读锁,读完后立即完成动作
- 可重复读取 - 而不是已提交的读取,读取锁仅在事务完成后过期。
但是在这种情况下他们如何使 Serializable ?实现的微妙之处可能非常好,但我想至少在肤浅的层面上理解。
据我了解,同步上下文的使用是可以让你在UI线程上继续(否则我们将无法更新UI,如果我们尝试,就会出现异常)。
1.正确理解?
我尝试在 .NET Core 2.2 控制台应用程序中执行该示例。使用长时间运行的异步操作创建了一个等待,与等待之前相同的上下文将用于继续。鉴于我知道的上下文存在的原因,我假设线程应该与等待之前相同。但是控制台的输出继续显示,而不是等待之前的线程 ID。
据我了解,由于(.NET Core 控制台)在执行时根本没有同步上下文。确实,那里没有UI,它有什么用。我想它只会像我想的那样在 UWP 和 WPF 等 UI 项目上工作。
但在这里:
我听说在 .NET Core 中不需要应用 ConfigureAwait(false)。是这样吗?
有信息表明 .NET Framework 在非 UI 项目中具有自己的上下文 + 可以在核心项目中创建自定义同步上下文。
2. 为什么在 UI 项目之外创建/使用上下文会有用?
3、为什么.NET Framework默认有同步上下文?
- 我不确定我是否正确理解支持在 .NET Core 后端使用 ConfigureAwait(false) 的论点。我是否正确理解它只有在以下情况下才有意义:(1)我选择了我在背面使用的逻辑的一部分,在一个库中并在 UI 项目中重用它。(2)我害怕第三 -可以带来自己的上下文并以某种方式种植主要项目的派对库。虽然为什么后面需要这样的库也是一个问题。 ?
如果存在带有 readonly 关键字的普通 Dictionary<K,V> ,那么拥有 ReadOnlyDictionary<K,V> 有什么意义?
计算出的哈希值与特定单元格相比如何?
碰撞的情况是可以理解的,但这不是关于那个的。
即使我们的值是排序的,它也将是一个对数。
同样,如何通过索引访问常量的数组?
作为操作系统用户,我不了解安全性,尽管我知道密码学和证书的基本概念。现在我尽量不要从不太知名的公司下载应用程序,也不要不必要地访问应用程序。在寻找通俗易懂的描述时,对于开发者来说,通常有一些表面的提示或深入的描述,很难在短时间内理解。所以我想问那些已经精通这个的人:
您如何将应用程序与数据分开?某些应用程序可能会请求访问文件系统的权限,但并不总是容易理解究竟允许什么。我可以将其他应用程序无法访问的重要信息存储在手机上的什么位置?在 Windows 上,在紧要关头,我可以在虚拟机上运行应用程序,而不必担心数据。在 Android 上,我不记得这种可能性。剪贴板呢,默认情况下它是否可供应用程序使用?我可以无所畏惧地复制密码吗?如果我不使用文件系统获取重要信息,而是在手机上使用 Google 驱动器,那么我是否无需担心设备上的其他应用程序?
默认情况下,应用程序可以访问其服务器,并且通常在没有它的情况下无法工作。例如,他们经常要求照片和视频的许可......所以他们可以毫无问题地将我的个人数据发送到服务器?联系方式也一样吗?
碰巧短信来自银行,代码自动插入银行应用程序。银行应用程序如何连接到此 SMS?另一个应用程序可以通过替换它来窃取数据吗?碰巧应用程序要求访问联系人和短信,所以他们可以访问这些代码?
根权限会出现什么问题?
很多中国新公司都在做安卓改造,为了安全而放纯安卓值得吗?这种修改通常是危险的吗?
还有什么可能对 Android 的安全性很重要?
我想了解解决问题的最简单方法。数轴上有值,需要根据请求为传入的数值找到一对现有的相邻值。在结构和输入中都不能有重复的点。
示例:在树 1、5、6、7.56、100 和输入 8 中,结果为 (7.56, 100)
还是另一种数据结构更适合这里?(要求的最大速度)
UPD:换句话说,我想出了它,但还没有实现。让我们将期望值称为 v。让我们开始寻找 v。如果最后一个值小于 v(node1),那么您需要找到一个最小值大于 node1 (node2) 的节点。如果最后一个值大于v(node2),那么你需要找到最大值小于node2 (node1)的节点。如果在树中找到值为 v 的节点,则报告异常。如果该对中没有值,则在响应中将其替换为 null,例如 (null,null) 或 (3,null)。
假设我想编写 2 个控制台程序:一个客户端和一个服务器。我将创建自签名证书,将它们安装在客户端计算机(此处为受信任的 .cer)和服务器(此处为私钥 .pfx)上。我正在使用 c#。
如何将我的服务器控制台与证书绑定?似乎在 Web 服务器(例如 IIS)中可以安装证书,也就是说,这是服务器应用程序与特定证书的绑定。如何在没有 Web 服务器的情况下将证书与程序链接?我是否需要以某种方式考虑应用程序代码中将是 https 的事实?
如何在客户端控制台上检查证书?听说这个逻辑是用浏览器写的。以编程方式从存储中提取证书并规定与来自服务器本身的证书进行比较的逻辑,或者您可以通过 cmd 将程序与证书链接起来,操作系统会自行检查所有内容?