相关疑难解决方法(0)

使用string作为锁来进行线程同步

当我查看一些遗留应用程序代码时,我注意到它正在使用字符串对象来进行线程同步.我正在尝试解决此程序中的一些线程争用问题,并想知道这是否会导致如此奇怪的情况.有什么想法吗 ?

private static string mutex= "ABC";

internal static void Foo(Rpc rpc)
{
    lock (mutex)
    {
        //do something
    }
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading synchronization mutex

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

有没有办法以与 C++ 相同的方式在 C# 中对齐对象以避免错误共享?

我是 C++ 栖息地,致力于 C# 项目。
我遇到过以下情况。

我已经class MyClass并且希望避免任何 2 个 MyClass 类型的对象共享缓存行,即使我有一个数组或任何 MyClass 类型的顺序集合。
在 C++ 中,我们可以声明class alignas(hardware_destructive_interference_size) Myclass,这将确保任何 2 个对象永远不会共享缓存行。

C#中有等效的方法吗?

c# c++ caching

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

获取.NET对象的内存地址(C#)

我试图追踪单声道运行时中的一个错误,其中一个变量似乎被分配给一个有效对象,然后被重新分配给一个虚假对象,特别是

//early in code I allocate, fine
var o = new object(); // valid allocation
// later in code this is called, not fine
lock(o) // <- is triggering bug due to "o" now referencing a nonsense memory location.
Run Code Online (Sandbox Code Playgroud)

我想知道何时对"o"的引用变得无意义,并且这样做是为了找到一种方法来确定C#代码中各个时间点的"o"的地址.我知道类似于其他问题的答案"不要做有GC",但GC不起作用所以我需要一个解决方法.

有谁知道如何在C#中确定单声道对象的地址?很好地链接在非托管代码或其他任何东西.(关于诊断主要问题的方法的任何其他线索).

c# mono garbage-collection

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

指向通用类型数组的指针?

我想创建一个泛型方法,该方法使用指向T数组的指针,其中T可以是C#原语,也可以是C#类.我一直很好,直到我尝试了"T"部分.

有没有办法解决错误"无法声明指向非非托管类型TIn的指针"

我尝试通过"fixed"关键字使用固定来实现这一点.

    public static object DoSomething<TIn, TOut>(object SObj, Action<TIn, TOut> takeAction)
    {
        double[]A = (double[]) SObj;
        TIn[]B = new TIn[5];
        unsafe
        {
            fixed (double* dbl = A) // <--- works okay
            {

            }
            fixed (TIn* Sptr = B)  // <--- fails
            {

            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

-

@dtb:刚检查出blittable."blittable类型的一维数组,例如整数数组.但是,包含blittable类型的可变数组的类型本身并不是blittable." 即使存在可以约束的约束,似乎它们也将它限制为一维的数组.

c# arrays

4
推荐指数
1
解决办法
2790
查看次数

类型字符串的引用对象比较

请考虑以下代码:

public static void Main()
{
    string str1 = "abc";
    string str2 = "abc";

    if (str1 == str2)
    {
        Console.WriteLine("True");
    }
    else
    {
        Console.WriteLine("False");
    }

    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

输出为"True".string是.Net中的引用类型我正在比较两个不同的对象,但输出仍为"True".

  1. 是因为它ToString()在两个对象上内部调用方法并在比较它们之前?
  2. 或者是因为a string是不可变类型?具有相同值的两个完全不同的 string对象将指向堆上的相同内存位置?

string比较是如何发生的?

内存分配如何在堆上运行?string具有相同值的两个不同对象是指向相同的内存位置还是指向不同的内存位置?

.net c# string operators

3
推荐指数
2
解决办法
246
查看次数

抛出 NullReferenceException 但对象通过了 null 检查,这怎么可能?

我正在使用该答案中的AddEventHandler方法,但是当在具有值类型参数的EventHandler上执行此操作时,会发生:

using System.Reflection;

public class Program
{
    public static event EventHandler<bool> MyEvent;

    public static void Main()
    {
        EventInfo eventInfo = typeof(Program).GetEvent(nameof(MyEvent));
        AddEventHandler(eventInfo, null, (s, e) => {
            if (e == null) return; // either if condition or null conditional operator
            Console.WriteLine(e?.ToString());
        });
        MyEvent(null, true);
    }

    public static void AddEventHandler(EventInfo eventInfo, object client, EventHandler handler)
    {
        object eventInfoHandler = eventInfo.EventHandlerType
            .GetConstructor(new[] { typeof(object), typeof(IntPtr) })
            .Invoke(new[] { handler.Target, handler.Method.MethodHandle.GetFunctionPointer() });

        eventInfo.AddEventHandler(client, (Delegate)eventInfoHandler);
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

有什么解释吗?

c# delegates system.reflection eventhandler .net-6.0

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

比较C#对象

考虑以下代码:

object str1 = "shahrooz";
object str2 = "shahrooz";
object int1 = 1;
object int2 = 1;

Console.WriteLine("str1 == str2 : " + (str1 == str2));
Console.WriteLine("int1 == int2 : " + (int1 == int2));
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

运行此代码时,您将获得以下结果:

str1 == str2 : True
int1 == int2 : False
Run Code Online (Sandbox Code Playgroud)

两个比较都是对象,但为什么第一个比较返回true但第二个比较返回false?

c# string

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