Dispatcher.CurrentDispatcher(in System.Windows.Threading)和Application.Current.Dispatcher(in System.Windows)之间有什么区别?
我的直觉告诉我,Application.Current.Dispatcher永远不会改变,并且对当前应用程序中的所有线程都是全局的,同时Dispatcher.CurrentDispatcher可能会Dispatcher根据调用它的线程创建一个新实例.
那是对的吗?
如果是,Dispatcher.CurrentDispatcher主要用于多线程UI 的目的是什么?
Daniel在他的回答中指出(除非我读错了)ECMA-335 CLI规范允许编译器生成抛出NullReferenceException以下DoCallback方法的代码.
class MyClass {
private Action _Callback;
public Action Callback {
get { return _Callback; }
set { _Callback = value; }
}
public void DoCallback() {
Action local;
local = Callback;
if (local == null)
local = new Action(() => { });
local();
}
}
Run Code Online (Sandbox Code Playgroud)
他说,为了保证NullReferenceException不抛出,volatile关键字应该用于_Callback或lock应该在线周围使用local = Callback;.
有人可以证实这一点吗?而且,如果确实如此,Mono和.NET编译器之间在这个问题上的行为是否存在差异?
编辑
这是标准的链接. …
这可能吗?
public interface Foo<TBar>
where TBar : (can use the '+' and '-' operators)
Run Code Online (Sandbox Code Playgroud)
谢谢.
以下代码中是否存在可能导致a的竞争条件NullReferenceException?
- 要么 -
Callback在空合并运算符检查空值之后但在调用函数之前,是否可以将变量设置为null?
class MyClass {
public Action Callback { get; set; }
public void DoCallback() {
(Callback ?? new Action(() => { }))();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
这是一个出于好奇而产生的问题.我通常不会这样编码.
我并不担心Callback变量变得陈旧.我担心会Exception被抛出DoCallback.
编辑#2
这是我的班级:
class MyClass {
Action Callback { get; set; }
public void DoCallbackCoalesce() {
(Callback ?? new Action(() => { }))();
}
public void DoCallbackIfElse() {
if (null != Callback) Callback();
else new Action(() => { })();
}
} …Run Code Online (Sandbox Code Playgroud) .net c# multithreading thread-safety null-coalescing-operator
我对.NET MVC很有经验,并且想要学习Python框架.我选择了金字塔.
.NET MVC具有母版页,视图和部分视图的概念.母版页看起来像:
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
<!DOCTYPE html>
<html>
<head runat="server">
<title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
</head>
<body>
<div>
<asp:ContentPlaceHolder ID="MainContent" runat="server" />
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
然后,我可以创建一个视图,填充MainContent主页面中标识的空间.
通过这里的金字塔维基教程,我看到作者在他的每个模板中重复了大部分相同的内容 - 通常在母版页中定义的内容 - 并且完全违反了DRY.
金字塔中是否有主页的概念?
我正试图在Mac上与Mono中的ImageMagick库互操作.我使用MacPorts安装了ImageMagick库,并验证了文件libMagickWand.dylib是否存在于目录/ opt/local/lib中.我还在/ usr/local/lib目录中创建了一个指向该文件的软链接.
这是我的DllImport声明:
[DllImport("libMagickWand", EntryPoint = "MagickWandGenesis")]
static extern void WandGenesis();
Run Code Online (Sandbox Code Playgroud)
这是我的App.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<dllmap dll="libMagickWand" target="/opt/local/lib/libMagickWand.dylib" />
</configuration>
Run Code Online (Sandbox Code Playgroud)
并且,在调用时WandGenesis();,我得到一个DllNotFoundException消息'libMagickWand'.
我已阅读此页面,我认为我遵循所有规则.还有什么我可以尝试的吗?
更新:
我使用MONO_LOG_LEVEL = debug运行.exe.以下是相关信息:
Mono: DllImport error loading library 'dlopen(/opt/local/lib/libMagickWand.5.dylib, 9):
no suitable image found.
Did find: /opt/local/lib/libMagickWand.5.dylib: mach-o, but wrong architecture'.
Run Code Online (Sandbox Code Playgroud)
错误的架构:我在32位模式下运行Snow Leopard并且总是有.我在MacPorts上安装了ImageMagick,并使用mono-project.com的Mac软件包安装了Mono.用不同的架构编译什么?
更新:
我想我发现了我的问题:
MacBook-Pro:lib ken$ lipo -info libMagickWand.5.dylib
Non-fat file: libMagickWand.5.dylib is architecture: x86_64
Run Code Online (Sandbox Code Playgroud)
更新:
......但我还有问题.我似乎无法弄清楚如何使用i386架构编译ImageMagick.当我尝试使用标志时,它会抱怨其他编译为64位的库.
下面的程序产生这个输出:
Foo<T> called
Process is terminated due to StackOverflowException.
Run Code Online (Sandbox Code Playgroud)
因此,Foo(baz)调用通用的Foo<T>,但Bar(baz)递归和并没有打电话Bar<T>.
我在C#5.0和Microsoft .NET上.当非泛型方法是一个时,编译器似乎选择泛型方法而不是递归override.
我在哪里可以找到这条规则的解释?(我猜想编译器会在两种情况下选择递归.)
以下是该计划的全部内容:
using System;
namespace ConsoleApplication1 {
class Baz { }
abstract class Parent {
public abstract void Foo(Baz baz);
}
class Child : Parent {
void Bar<T>(T baz) {
Console.WriteLine("Bar<T> called");
}
public void Bar(Baz baz) {
Bar(baz);
}
void Foo<T>(T baz) {
Console.WriteLine("Foo<T> called");
}
public override void Foo(Baz baz) {
Foo(baz);
} …Run Code Online (Sandbox Code Playgroud) NuGet上的MySql.ConnectorNET.Data和MySql.Data包之间有什么区别?
它们似乎都是由同一个用户(MySQL)发布的,Project Site链接指向同一个位置(http://dev.mysql.com/downloads/).
安装两者后,ConnectorNET版本似乎落后于另一版本.
我有两个XElement实例:
var el1 = new System.Xml.Linq.XElement("xel", null);
var el2 = new System.Xml.Linq.XElement("xel", string.Empty);
Run Code Online (Sandbox Code Playgroud)
el1 看起来像这样:
<xel />
Run Code Online (Sandbox Code Playgroud)
el2 看起来像这样:
<xel></xel>
Run Code Online (Sandbox Code Playgroud)
然而,两者的Value属性相等.string.Empty
我能想到很多黑客来区分的null,从string.Empty在XElement,但有一些内置的框架,要做到这一点,我很想念?
我有一个测量仪器对象:
public class Instrument
{
public double Measure()
{
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个需要做一些测量的设备:
public class Device
{
public Instrument MeasuringInstrument { get; set; }
public void DoMeasuring()
{
var result = this.MeasuringInstrument.Measure();
}
}
Run Code Online (Sandbox Code Playgroud)
测量仪器一次只能在一个设备上运行,但许多设备可能使用同一台仪器.我是线程新手,根据我的理解,以下两种解决方案都有警告.
public class Instrument
{
public double Measure()
{
lock(this)
{
return 0;
}
}
}
public class Device
{
public Instrument MeasuringInstrument { get; set; }
public void DoMeasuring()
{
lock(this.MeasurementInstrument)
{
var result = this.MeasuringInstrument.Measure();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经读过最好锁定私有对象,但我不知道如何做到这一点,同时仍允许在Device上获取/设置MeasuringInstrument.有什么建议?
非常感谢,
肯
c# ×7
.net ×5
architecture ×1
chameleon ×1
dispatcher ×1
generics ×1
il ×1
imagemagick ×1
interop ×1
linq-to-xml ×1
locking ×1
master-pages ×1
mono ×1
mysql ×1
nuget ×1
overloading ×1
pyramid ×1
types ×1
wpf ×1
xelement ×1