小编Thi*_*Use的帖子

如何判断当前线程是否为UI线程?

我正在为UWP开发一个用户控件,并在某些调用时更新它的一些视觉效果.但是,由于核心.NET库已被转移并且线程类已被严重削减,我不知道如何从用户控件中的方法中识别调用线程是否是UI线程,因此它知道是否使用调度程序更改依赖项属性.

有人知道怎么做吗?

编辑:调度程序在功能上可以在UI线程上"调用"异步 - 但是,我真的不知道这是不是一个好主意 - 尝试通过调度程序从主线程调用主线程.如果有人有理由这是好还是坏,这也有助于回答这个问题.如果没有理由不在主线程上使用调度程序,那么我猜没有问题.

c# multithreading windows-10 uwp

10
推荐指数
1
解决办法
4036
查看次数

从同一个"父"类获取另一个嵌套类的类型

我正在尝试在学习编程时第一次创建命名空间.我希望有一种解决我遇到的问题的方法并不是特别凌乱,但实质上我有一个类对象,它保存两个嵌套类对象的两个字典.我需要能够将NestedClassA的Dictionary传递给NestedClassB,或者允许NestedClassB以某种方式访问​​它......这是我正在尝试做的一个例子:

namespace MyFirstNamespace 
{
    public class BossClass 
    {
        public Dictionary<int, NestedClassA> DictionaryA = new Dictionary<int, NestedClassA>();
        public Dictionary<int, NestedClassB> DictionaryB = new Dictionary<int, NestedClassB>();

        public class NestedClassA { ...arbitrary class definition... }

        public class NestedClassB 
        {
            public Dictionary<int, NestedClassA> PassedDictionary;

            public NestedClassB() { }

            public NestedClassB(Dictionary<int, NestedClassA> tempDic))
            {
                PassedDictionary = tempDic;
            }
        }


        public BossClass() { ... arbitrary constructor ... }

        ...arbitrary dictionary population methods...

        function void CreateAClassBInstance()
        {
            DictionaryB[n] = new NestedClassB(n, DictionaryA);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题似乎是我不能在"NestedClassB"中对"NestedClassA"进行类型转换,因为它无法识别该类型.是否可以访问B中的"NestedClassA"类型?我尝试过的任何东西都没有效果.我是否必须传递"BossClass"的实例,以便我可以通过" Dictionary<int, …

c# parameter-passing nested-class

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

带锁的单例属性如何确保线程安全?

我很少使用单身人士,在这种情况下它是合适的.在尝试调查其最佳实现时,我遇到了一些代码,这让我相信我不正确地理解括号是如何封装"范围"的.

public sealed class Singleton
{
    private static Singleton instance = null;
    private static readonly object padlock = new object();

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

我很困惑当我尝试访问"实例"时会发生什么.假设我正在处理日志单例(我对单例的有用应用程序),它有一个方法"WriteLine(string line)"

我打电话的时候:

Singleton.Instance.WriteLine("Hello!");
Run Code Online (Sandbox Code Playgroud)

它在执行"WriteLine?"的整个方法时保持锁定.

如果我将实例分配给外部变量,例如:

Singleton Console = Singleton.Instance;
Run Code Online (Sandbox Code Playgroud)

现在有一个对单身人士之外的单身人士的不断引用.难道Console.WriteLine("Hello!")也是完全线程安全的喜欢Singleton.Instance.WriteLine("Hello!")

无论如何,我只是混淆了如何使单例线程安全,以及在显式访问属性时它是否只是线程安全.我想Singlton.Instance.WriteLine("...")先将实例拉出,从而保留锁的范围,然后WriteLine在返回的实例上执行,因此在释放锁之后执行写操作.

任何帮助,以清除我对如何理解这些功能的误解.

c# singleton multithreading design-patterns locking

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

如何让控件重绘Windows窗体?

我不确定要寻找的是“重绘” ...我是手工设计Windows表单的新手。我创建了一个将使用“ TableLayoutPanel”作为传递变量的类,并在该表布局面板中进行了自己的设计,以便可以重用控件并调整其参数以适合其包含的数据。

我有一个事件,它将在调整框架大小时重新绘制控件,效果很好。但是,当我第一次使用.Show()表单时,它不会显示class中的任何子控件。如果我手动调用Resize事件中调用的“ resize”方法,它也不会重绘自身。

我得到的只是一个空白的“ TableLayoutPanel”,直到我手动调整了在父TableLayoutPanel上调用“ Resize”事件的窗口的大小。

这是我的类的正式版本,其中删除了与方法无关的方法:

    public class DataTableFrame : Form
    {

        TableLayoutPanel MyFrame;
        Size ParentSize;
        int Row = 1;
        int Col = 1;
        int LabelWidth = 75;
        int TextWidth = 150;            
        List<DataObject> MyData = new List<DataObject>();


        public class DataObject
        {...
        }

        public DataTableFrame() { }

        public DataTableFrame(TableLayoutPanel Parent)
        {
            MyFrame = Parent;
            MyFrame.AutoScroll = true;
            ParentSize = MyFrame.Size;
            MyFrame.Layout += new LayoutEventHandler(MyFrame_Layout);
        }

        void MyFrame_Layout(object sender, LayoutEventArgs e)...

        public void AddData(string Label, string Data)... …
Run Code Online (Sandbox Code Playgroud)

c# redraw visual-studio winforms

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

如何在第一次使用之前保持静态数组的内存不足

我对C++很新,所以我对静态数组的工作方式感到有些困惑.我知道在C#中,数组在第一次访问之前不会被放入内存中,如果您希望它立即可访问,则可能会出现问题.但是,我正在努力将Perlin类转换为C++,并且我希望有多个静态数组,其中只有一个可以在运行时使用或者任意数量.实际上,它并不是那么大的内存问题,因为它们都不会超过50kb,但是,我宁愿知道是否有可能确保数组没有加载到内存中,除非我要求它.有没有办法确保源代码中定义的静态数组没有加载到内存中,除非要求?这是一个非常挑剔的事情(尤其是x64),但我更愿意尽可能优化它.我讨厌用不会被使用的东西占用内存的想法.

或者也许静态数组甚至没有办法 - 只是动态类对象包装数组?

我想真正的问题是:在c ++中实现表查找的最有效的解决方案是什么,可能并非全部使用?

c++ arrays static pointers memory-management

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

究竟什么"锁定"锁定?

我正在创建一个创建和管理多个套接字连接的类,它将从套接字接收的信息转发到主线程,反之亦然.我传递了大量信息的多线程对我来说是新的(就像C#中的大多数事情一样),所以我需要澄清究竟locks做了什么.

当我锁定方法的一部分时,它只确保没有其他线程可以进入该部分代码,或者它是否确实阻止该部分代码中的所有变量被其他线程修改,无论它们出现在何处?

例如:

public class TestLock
{
    public volatile int a = 0;
    public volatile int b = 2;
    private object ALock = new Object();

    public TestLock() { }

    public void UnlockEdit(int atemp, int btemp)
    {
        a = atemp;
        b = btemp;
    }

    public void LockedEdit(int atemp, int btemp)
    {


        lock(ALock)
        {
            a = atemp;
            b = btemp;
        }
    }

    public int[] ReturnValues()
    {
        int[] ret = new int[2];

        lock (ALock)
        {
            ret[0] = a;
            ret[1] = b; …
Run Code Online (Sandbox Code Playgroud)

c# multithreading locking

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