小编Mat*_*ley的帖子

ManualResetEvent与Thread.Sleep

我实现了以下后台处理线程,其中JobsQueue<T>:

static void WorkThread()
{
    while (working)
    {
        var job;

        lock (Jobs)
        {
            if (Jobs.Count > 0)
                job = Jobs.Dequeue();
        }

        if (job == null)
        {
            Thread.Sleep(1);
        }
        else
        {
            // [snip]: Process job.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这产生正在进入作业时之间的noticable延迟,当他们实际上开始运行(作业批次在一旦进入,而每个工作只是[比较]小)的延迟是不是一个大问题,但我开始思考这个问题,并做了以下改变:

static ManualResetEvent _workerWait = new ManualResetEvent(false);
// ...
    if (job == null)
    {
        lock (_workerWait)
        {
            _workerWait.Reset();
        }
        _workerWait.WaitOne();
    }
Run Code Online (Sandbox Code Playgroud)

线程添加作业现在锁定_workerWait_workerWait.Set()在完成添加作业时调用.这个解决方案(貌似)立即开始处理工作,延迟完全消失.

我的问题部分是"为什么会发生这种情况?",被认为Thread.Sleep(int)可以比你指定的更长时间地睡眠,部分是"如何ManualResetEvent实现这种性能水平?".

编辑:由于有人询问了排队项目的功能,现在它和目前的完整系统一起.

public void RunTriggers(string data)
{
    lock …
Run Code Online (Sandbox Code Playgroud)

c# multithreading sleep manualresetevent

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

C#中的函数指针

我想在某些方面(或两者)DelegateMethodInfo有资格获得这个头衔.但是,它们都没有提供我正在寻找的语法上的好处.所以,简而言之,有什么方法可以写下面的内容:

FunctionPointer foo = // whatever, create the function pointer using mechanisms
foo();
Run Code Online (Sandbox Code Playgroud)

我不能使用可靠的委托(即,使用delegate关键字来声明委托类型),因为直到运行时才能知道确切的参数列表.作为参考,这里是我目前在LINQPad中使用的内容,B用户生成的代码将在哪里(因此)Main,因此对我的用户来说非常好,我试图删除.Call:

void Main()
{
    A foo = new B();
    foo["SomeFuntion"].Call();
}

// Define other methods and classes here
interface IFunction {
    void Call();
    void Call(params object[] parameters);
}

class A {
    private class Function : IFunction {
        private MethodInfo _mi;
        private A _this;
        public Function(A @this, MethodInfo mi) {
            _mi = mi;
            _this = @this; …
Run Code Online (Sandbox Code Playgroud)

c# reflection delegates

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

具有对象初始化器的不可变对象

我有一个不可变对象的尝试:

class MyObject
{
    private static int nextId;

    public MyObject()
    {
        _id = ++nextId;
    }

    private int _id;
    public int Id { get { return _id; } }
    public string Name { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,我试着像这样使用它:

MyObject o1 = new MyObject { Name = "foo" };
Run Code Online (Sandbox Code Playgroud)

但是对象初始化器失败了,因为它Name的setter是私有的.有没有办法解决这个问题,还是我必须在一个或另一个之间做出选择?

c#

11
推荐指数
2
解决办法
2611
查看次数

关于Environment.ProcessorCount的问题

我很好奇.NET属性Environment.ProcessorCount实际返回的内容.它是返回核心数,处理器数还是两者兼有?如果我的计算机有2个处理器,每个处理器有4个核心,将Environment.ProcessorCount返回2,4或8?

.net c# multithreading

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

img标签的alt属性是否需要编码?

在html中,img标签的alt属性中的文本是否需要编码/转义?

非编码示例:

<img src="myimg.png" alt="image description" />
Run Code Online (Sandbox Code Playgroud)

编码示例:

<img src="myimg.png" alt="image%20description" />
Run Code Online (Sandbox Code Playgroud)

html syntax encoding escaping

10
推荐指数
2
解决办法
9178
查看次数

不可变类与不可变结构

我有一个开始生活可变的课程,但我已经让它变得一成不变.我应该改成它struct吗?选择一个而不是另一个需要考虑哪些因素?我的特殊情况是一个Point类型类(它代表一个自定义坐标系中的坐标),由4个int字段组成,加上一些属性以不同的方式访问相同的数据.我注意到这String是一个类并且是不可变的,因此必须有一些用例.

c# immutability

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

Tag属性的常见用途

我已经开始使用这个很多来将我的UI元素链接到他们的数据支持类(无论可能是什么).您将Tag属性用于哪些常见用途?

的确,你是否完全使用它?我知道我很久没有了.

c# silverlight wpf winforms

9
推荐指数
1
解决办法
9787
查看次数

XML反序列化'标准化'行结尾,如何阻止它?(.净)

我有一个标有属性的类[XmlText],它接受多行输入.在我的XML文件中,我已经验证了文本内容中的行结尾是非常的"\r\n",与文件的其余部分相同.

我用来反序列化的代码是:

XmlSerializer configSerializer = new XmlSerializer(typeof(WorldList));
string file = "test.xml";

if (File.Exists(file))
{
    using (TextReader r = new StreamReader(file))
    {
        foo = configSerializer.Deserialize(r);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在该[XmlText]物业的制定者内部,value已经有"\n"一条线结束.这令人讨厌的主要原因是因为"\n"线路末端没有正确显示TextBox...我不确定哪个部分导致了问题,但我认为这里的某个人可能能够对这种情况有所了解.

c# xml newline xml-serialization

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

C#中的多键词典(另一种)?

基于这个问题,是否有一个简单的解决方案,可以使用多键字典,其中任何一个键都可以用来识别值?

即.

MultikeyDictionary<TKey1, TKey2, TValue> foo;
foo.Add(key1, key2, value);
myValue = foo[key1];
// value == myValue
foo.Remove(key2);
myValue = foo[key1]; // invalid, Exception or null returned
Run Code Online (Sandbox Code Playgroud)

c# data-structures

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

搜索引擎处理Javascript吗?

根据这个页面,它们看起来似乎没有,因为它们实际上没有运行它,但该页面是2年(从版权信息判断).

我问这个问题的原因是因为我们使用Javascript将我们网站上的文字替换为其他更加印刷的声音内容.我们担心这可能会影响我们网站的可抓取性/搜索引擎优化,因为我们所取代的通常是标题; 即.<h1>,<h2>等等.

搜索引擎机器人会看到我们的原始代码,还是会运行Javascript并查看替换的文本?

html javascript seo search-engine

9
推荐指数
1
解决办法
1146
查看次数