我实现了以下后台处理线程,其中Jobs是Queue<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) 我想在某些方面(或两者)Delegate或MethodInfo有资格获得这个头衔.但是,它们都没有提供我正在寻找的语法上的好处.所以,简而言之,有什么方法可以写下面的内容:
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) 我有一个不可变对象的尝试:
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是私有的.有没有办法解决这个问题,还是我必须在一个或另一个之间做出选择?
我很好奇.NET属性Environment.ProcessorCount实际返回的内容.它是返回核心数,处理器数还是两者兼有?如果我的计算机有2个处理器,每个处理器有4个核心,将Environment.ProcessorCount返回2,4或8?
在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) 我有一个开始生活可变的课程,但我已经让它变得一成不变.我应该改成它struct吗?选择一个而不是另一个需要考虑哪些因素?我的特殊情况是一个Point类型类(它代表一个自定义坐标系中的坐标),由4个int字段组成,加上一些属性以不同的方式访问相同的数据.我注意到这String是一个类并且是不可变的,因此必须有一些用例.
我已经开始使用这个很多来将我的UI元素链接到他们的数据支持类(无论可能是什么).您将Tag属性用于哪些常见用途?
的确,你是否完全使用它?我知道我很久没有了.
我有一个标有属性的类[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...我不确定哪个部分导致了问题,但我认为这里的某个人可能能够对这种情况有所了解.
基于这个问题,是否有一个简单的解决方案,可以使用多键字典,其中任何一个键都可以用来识别值?
即.
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) 根据这个页面,它们看起来似乎没有,因为它们实际上没有运行它,但该页面是2年(从版权信息判断).
我问这个问题的原因是因为我们使用Javascript将我们网站上的文字替换为其他更加印刷的声音内容.我们担心这可能会影响我们网站的可抓取性/搜索引擎优化,因为我们所取代的通常是标题; 即.<h1>,<h2>等等.
搜索引擎机器人会看到我们的原始代码,还是会运行Javascript并查看替换的文本?
c# ×8
html ×2
.net ×1
delegates ×1
encoding ×1
escaping ×1
immutability ×1
javascript ×1
newline ×1
reflection ×1
seo ×1
silverlight ×1
sleep ×1
syntax ×1
winforms ×1
wpf ×1
xml ×1