我有一个变量,我用来表示状态.它可以从多个线程读取和写入.
我正在使用Interlocked.Exchange并Interlocked.CompareExchange改变它.但是我从多个线程中读取它.
我知道volatile可以用来确保变量不在本地缓存,但总是直接从内存中读取.
但是,如果我将变量设置为volatile,则会生成有关使用volatile并使用ref传递给Interlocked方法的警告.
我想确保每个线程都读取变量的最新值而不是某些缓存版本,但我不能使用volatile.
有一个Interlocked.Read 但是它适用于64位类型,并且在紧凑的框架上不可用.它的文档说32位类型不需要它,因为它们已经在一次操作中执行.
如果您使用Interlocked方法进行所有访问,则互联网上有一些声明您不需要使用volatile.但是,您无法使用Interlocked方法读取32位变量,因此您无法使用Interlocked方法进行所有访问.
有没有办法在不使用锁的情况下完成我的变量的线程安全读写?
我有一个base32字符串,我需要将其转换为字节数组.我在.NET框架中找到转换方法时遇到了麻烦.我可以找到base64的方法,但不能找到base32的方法.
Convert.FromBase64String - 像base32这样的东西是完美的.
在框架中是否有这样的方法或者我必须自己滚动?
C# 9 中引入的静态 lambda 允许我们将 lambda 表达式标记为静态,以防止它捕获实例状态。
但是,当您检查 lambda 上的 .Target 属性时,它仍然被设置,这与您将 Action 设置为没有目标的静态方法时不同。
Action action = static () => Console.WriteLine("test");
if(action.Target != null)
{
// action unexpectedly holds a reference
}
Run Code Online (Sandbox Code Playgroud)
背景:我正在尝试创建一个事件系统(不依赖于当前的事件语法),它使用弱引用而不需要反射(MethodInfo)。我正在检查 .Target 是否为 null,但这对于静态 lambda 不起作用,其中静态 lambda .Target 设置为嵌套单例。
我一直在为我的代码添加依赖注入,因为它使代码更容易通过模拟进行单元测试.
但是我要求在我的调用链上方的对象知道调用链中的对象.
这会违反得墨忒耳法吗?如果是这样重要吗?
例如:类A依赖于接口B,要使用的接口的实现被注入到类A的构造函数中.任何想要使用类A的人现在都必须具有对B的实现的引用.并且可以直接调用其方法意义并了解其子组件(接口B)
维基百科说Demeter法则:"基本概念是一个给定的对象应该尽可能少地假设其他任何东西的结构或属性(包括它的子组件)."
我们一直在使用很大程度上依赖于表达式树和reflection.emit 的最小起订量。但是 Span 不允许出现在表达式树中,因此不能用它来模拟采用或返回 Span 的方法。
我们一直在通过自己实现接口来手动创建模拟来解决这个问题。但这非常耗时,而且远非理想。
如何模拟接受或返回 Span 的方法?
我有一个DrawingArea,我想收到鼠标事件.从教程中我发现KeyPressEvent也会捕获鼠标事件.但是对于以下代码,从不调用处理程序.
static void Main ()
{
Application.Init ();
Gtk.Window w = new Gtk.Window ("");
DrawingArea a = new CairoGraphic ();
a.KeyPressEvent += KeyPressHandler;
w.Add(a);
w.Resize (500, 500);
w.DeleteEvent += close_window;
w.ShowAll ();
Application.Run ();
}
private static void KeyPressHandler(object sender, KeyPressEventArgs args)
{
Console.WriteLine("key press event");
}
Run Code Online (Sandbox Code Playgroud)
我通过阅读不同的论坛和教程尝试了很多东西,包括:
将EventBox添加到窗口并将DrawingArea放入事件框并订阅EventBox的KeyPressEvent.(没用)
调用AddEvents((int)Gdk.EventMask.AllEventsMask); 在任何和所有小部件上
我确实发现订阅Windows KeyPressEvent确实给了我键盘事件但不是鼠标点击事件.
单声道文档中的所有相关页面都给我错误,所以我有点卡住了
让我们说只是为了它的乐趣,我决定不再用Java编写桌面应用程序,而是想切换到使用C#.我希望能够构建一个将在某些主流Linux发行版上运行的应用程序,以及最近发布的MS Windows.它将有一个GUI组件.
在Java中,我可以构建一个使用Swing的应用程序.一旦我有它工作,我可以将该jar文件从Windows复制到Linux,反之亦然,这取决于我开发它的位置.它通常会运行java -jar myapp.jar.
在C#中可以这样做吗?在C#中是否有与Swing或AWT相同的功能?
他们是VS2010和.net 4.0的紧凑型框架的新版本,如果是这样,它将包括哪些新功能?WPF?linq到SQL?等等
我有一个.net标准1.4项目,我通过.net 4.6.1项目的项目引用引用它.
当我运行时,我收到以下消息:
System.IO.FileNotFoundException:'无法加载文件或程序集'System.Threading.Thread,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一.该系统找不到指定的文件.'
我可以通过引用System.Threading.Thread版本4.3.0的nuget包来解决这个问题.但由于某种原因,这实际上是版本4.0.1.0,这意味着我需要一个绑定重定向.
添加绑定重定向让我超越了这个问题并进入下一个问题.这是:
System.IO.FileNotFoundException:'无法加载文件或程序集'System.IO.FileSystem,Version = 4.0.1.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一.该系统找不到指定的文件.'
我是否需要为.net标准软件包的所有依赖项手动添加软件包(以及可能的绑定重定向)?这似乎不是出售的东西.如果我必须提供所需的所有程序集,即使这些已经包含在我所针对的.net框架中的GAC中,那么.net标准是什么意思.我无法看到它是如何出售的.net标准1.4与.net 4.6.1兼容,如果兼容你的意思是只要你不使用.net 4.6.1 BCL库.
以下问题似乎是相关的https://github.com/NuGet/Home/issues/4488 但是我已经尝试了那里的建议工作.这是添加:
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
Run Code Online (Sandbox Code Playgroud)
到.net 4.6.1项目.我尝试过这个并没有什么区别.
更新 将以下内容添加到我的.net 4.6.1项目后:
<PackageReference Include="Legacy2CPSWorkaround" Version="1.0.0">
<PrivateAssets>All</PrivateAssets>
</PackageReference>
Run Code Online (Sandbox Code Playgroud)
我现在在输出目录中有System.IO.FileSystem,但它的版本错误.这是4.0.2.0.我可以再次使用绑定重定向来解决这个问题,但我不应该这样做.
我不知道这个4.0.2.0 dll来自哪里,因为它不在我的包文件夹中所以它不能来自nuget?
如何从 ReadOnlySequence 解析 UTF8 字符串
ReadOnlySequence 由部分组成,并且由于 UTF8 字符是可变长度的,因此部分的中断可能位于字符的中间。因此,简单地在部件上使用 Encoding.UTF8.GetString() 并将它们组合在 StringBuilder 中是行不通的。
是否可以从 ReadOnlySequence 解析 UTF8 字符串,而无需先将它们组合成数组。我宁愿避免在这里分配内存。