小编ken*_*ken的帖子

Dispatcher.CurrentDispatcher与Application.Current.Dispatcher

Dispatcher.CurrentDispatcher(in System.Windows.Threading)和Application.Current.Dispatcher(in System.Windows)之间有什么区别?

我的直觉告诉我,Application.Current.Dispatcher永远不会改变,并且对当前应用程序中的所有线程都是全局的,同时Dispatcher.CurrentDispatcher可能会Dispatcher根据调用它的线程创建一个新实例.

那是对的吗?

如果是,Dispatcher.CurrentDispatcher主要用于多线程UI 的目的是什么?

.net wpf dispatcher

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

在这种常见模式中是否存在用于防止NullReferenceException的竞争条件?

我问了这个问题并得到了这个有趣(并且有点令人不安)的答案.

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关键字应该用于_Callbacklock应该在线周围使用local = Callback;.

有人可以证实这一点吗?而且,如果确实如此,Mono.NET编译器之间在这个问题上的行为是否存在差异?

编辑
这是标准的链接. …

.net c# il multithreading thread-safety

25
推荐指数
1
解决办法
985
查看次数

约束类型允许C#中的加/减操作(+/-)

这可能吗?

public interface Foo<TBar>
  where TBar : (can use the '+' and '-' operators)
Run Code Online (Sandbox Code Playgroud)

谢谢.

c# types

17
推荐指数
2
解决办法
2545
查看次数

C#中的空合并运算符(??)是否是线程安全的?

以下代码中是否存在可能导致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

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

金字塔框架和主模板/母版页/部分视图

我对.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.

金字塔中是否有主页的概念?

master-pages pyramid chameleon template-metal

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

在Mac上的Mono中使用DllImport进行DllNotFoundException:错误的体系结构

我正试图在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位的库.

c# architecture mono interop imagemagick

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

为什么在非泛型存在时选择通用方法?

下面的程序产生这个输出:

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)

c# generics overloading overload-resolution

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

MySql.ConnectorNET.Data vs MySql.Data

NuGet上的MySql.ConnectorNET.DataMySql.Data包之间有什么区别?

它们似乎都是由同一个用户(MySQL)发布的,Project Site链接指向同一个位置(http://dev.mysql.com/downloads/).

安装两者后,ConnectorNET版本似乎落后于另一版本.

.net mysql mysql-connector nuget connector-net

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

区分XElement中的null和string.Empty值

我有两个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.EmptyXElement,但有一些内置的框架,要做到这一点,我很想念?

.net c# xelement linq-to-xml

6
推荐指数
1
解决办法
4525
查看次数

C#中锁定(或进入/退出)的最佳实践

我有一个测量仪器对象:

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# multithreading locking

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