小编Bob*_*orn的帖子

Monitor.TryEnter with Generic Class

我有一种情况,为了测试,我只希望我的计时器方法(FooMethod)一次运行一个.在下面的示例中,FooMethod作为委托传递给计时器.这个类有很多具体的例子.我认为通过使_locker静态,只有一个FooMethod()实例会一次处理.但是当我运行应用程序时,多个线程一次超过TryEnter()行.

这就是我将每个类添加到新计时器的方法.这是在一个循环中为每个foo实例完成的:

_timers.Add(new Timer(foo.FooMethod, null, 0, 10000));
Run Code Online (Sandbox Code Playgroud)

这是具有该方法的类:

public class Foo<T>
{
    private static readonly object _locker = new object();

    public void FooMethod(object stateInfo)
    {
        // Don't let threads back up; just get out
        if (!Monitor.TryEnter(_locker)) { return; }

        try
        {
            // Logic here
        }
        finally
        {
            Monitor.Exit(_locker);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:通常,_locker不是静态的; 在有机会完成之前,我不希望同一个线程进入该方法.我把它改为静态测试.

我的第一个想法是,这可能不起作用,因为这个类是通用的?并且每个具体类实际上是它自己的类,它们不共享_locker变量?真的吗?如果这是真的,我应该如何让具体类共享一个_locker变量?我是否需要将静态_locker变量添加到Foos可以访问的其他类中?

c# multithreading locking

7
推荐指数
2
解决办法
331
查看次数

在我的代码中硬编码复杂的数学逻辑是否可以?

是否有一种普遍接受的编码复杂数学的最佳方法?例如:

double someNumber = .123 + .456 * Math.Pow(Math.E, .789 * Math.Pow((homeIndex + .22), .012));
Run Code Online (Sandbox Code Playgroud)

这是一个硬编码数字的点吗?或者每个数字是否都有与之相关的常数?或者是否有另一种方式,比如在config中存储计算并以某种方式调用它们?

会有很多像这样的代码,我试图让它保持可维护性.

注意:上面显示的示例只是一行.这些代码行将有数十或数百行.不仅数字会改变,而且公式也可以改变.

c#

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

当一个子类已经从不同的基类派生时,子类如何共享行为?

我有两个实现ISomeBehavior的类.现在我希望他们分享功能.通常我会用一个抽象类替换ISomeBehavior,比如SomeBehaviorBase.问题是其中一个子类已经从另一个类派生,而另一个类不是我们拥有的软件.(这是C#,因此多重继承不是一种选择.)从第三方类派生的子类没有实现.它只是派生自第三方类,并实现了ISomeBehavior,因此第三方类的处理方式与实现ISomeBehavior的其他子类相同.

我目前所做的是在ISomeBehavior上实现一个扩展方法.现在消费代码可以调用该方法.这种方法的问题是我想强制调用代码使用这个扩展方法.我无法从界面中删除SomeMethod(),因为扩展方法最终必须调用它.

关于如何让两个类优雅地分享相同的行为的任何想法,当其中一个已经派生自另一个,第三方,类?注意:策略设计模式在这里听起来很有意义,但是当子类之间的行为发生变化时会使用该模式.这里的行为没有变化; 它只需要分享.

c# share behavior subclass

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

代码如何在异常后执行?

我必须遗漏一些东西......如何抛出异常,但异常后的代码仍会在调试器中被击中?

private UpdaterManifest GetUpdaterManifest()
{
    string filePathAndName = Path.Combine(this._sourceBinaryPath, this._appName + ".UpdaterManifest");

    if (!File.Exists(filePathAndName))
    {
        // This line of code gets executed:
        throw new FileNotFoundException("The updater manifest file was not found. This file is necessary for the program to run.", filePathAndName);
    }

    UpdaterManifest updaterManifest;

    using (FileStream fileStream = new FileStream(filePathAndName, FileMode.Open))
    {
        // ... so how is it that the debugger stops here and the call stack shows
        // this line of code as the current line? How can we …
Run Code Online (Sandbox Code Playgroud)

c# exception visual-studio-debugging

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

RavenDB Linq无效操作.ToUpperInvariant()

我正在尝试ToUpperInvariant()在RavenDB的LINQ查询中使用.我收到了一个InvalidOperationException:

无法理解如何翻译server.Name.ToUpperInvariant().

查询如下.为了让我能够在这里按姓名匹配,需要做些什么?这在使用RavenDB的查询中是否可行?

public ApplicationServer GetByName(string serverName)
{
    return QuerySingleResultAndCacheEtag(session => session.Query<ApplicationServer>()
        .Where(server => server.Name.ToUpperInvariant() == serverName.ToUpperInvariant()).FirstOrDefault())
        as ApplicationServer;
}

protected static EntityBase QuerySingleResultAndCacheEtag(Func<IDocumentSession, EntityBase> func)
{
    if (func == null) { throw new ArgumentNullException("func"); }

    using (IDocumentSession session = Database.OpenSession())
    {
        EntityBase entity = func.Invoke(session);
        if (entity == null) { return null; }
        CacheEtag(entity, session);
        return entity;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# linq ravendb

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

System.Tuple在多个程序集中定义

我刚刚在Windows 8中安装了VS 11.当我获得使用VS 2010构建的最新解决方案,然后构建它,我收到此错误(在VS 11中):

预定义类型"System.Tuple"在全局别名中的多个程序集中定义; 使用'c:\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\mscorlib.dll'中的定义

我无法通过Google找到答案.我不知道"全球别名"是什么.这些单词过于通用,无法通过Google搜索找到.

VS 11自动做了一些更改,所以我解除了那些,重新编译,并得到了同样的错误.

我不知道该怎么做.任何人都知道如何解决此错误?什么是全球化的别名?

编辑 - 这些是项目中当前存在的引用

我尝试删除未使用的引用但仍然出现错误.

在此输入图像描述

编辑2 - 答案

System.Tuple,乌鸦组件内,冲突与.NET 4.0 System.Tuple.感谢Christopher Currens在他的回答中解释这一点.

在此输入图像描述

.net compiler-errors .net-4.0 .net-4.5 visual-studio-2012

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

为什么Func <>和Expression <Func <>>可以互换?为什么一个人在我的情况下工作?

我有一个数据访问类,花了我一段时间才能开始工作.对于我的应用程序,我需要获得不同类型的SQL Server表,其中WHERE子句仅因列名而不同:某些列是read_time,其他列是ReadTime,其他列是LastModifiedTime.所以我想我会传入WHERE子句,所以我不需要为50个不同的表创建一个新方法.它看起来很简单,而且有效,但我不明白.

以Expression <>为参数的此方法有效:

internal List<T> GetObjectsGreaterThanReadTime<T>(Expression<Func<T, bool>> whereClause) where T : class
{
    Table<T> table = this.Database.GetTable<T>();
    IEnumerable<T> objects = table.Where(whereClause);

    return objects.ToList();
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试这种方式(下面)一段时间,它只会挂在最后一行(ToList()).首先,为什么要编译?我的意思是,为什么Expression和Func可以互换使用作为参数?那么,为什么Expression工作,而Func版本只是挂起?

注意:上述方法与此方法之间的唯一区别是方法参数(Expression vs. Func).

internal List<T> GetObjectsGreaterThanReadTime<T>(Func<T, bool> whereClause) where T : class
{
    Table<T> table = this.Database.GetTable<T>();
    IEnumerable<T> objects = table.Where(whereClause);

    return objects.ToList();
}
Run Code Online (Sandbox Code Playgroud)

c# oop generics linq-to-sql

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

客户端未收到SignalR消息

我一直在尝试让我的WPF客户端应用程序接收WCF服务发送的SignalR消息.我已经尝试了许多东西,并且现在已经采取行动,希望有些东西可行.我已经在线跟踪了教程和示例,我根本无法得到我的WPF OnSignalRMessage()方法来调用.我在哪里错了?

我的中心:

public class PrestoHub : Hub
{
    public void Send(string message)
    {
        Clients.All.OnSignalRMessage(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的启动课:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HubConfiguration { EnableCrossDomain = true };

        app.MapHubs("http://localhost:8084", config);
    }
}
Run Code Online (Sandbox Code Playgroud)

启动SignalR主机的方法(在我的WCF服务主机中):

    private void StartSignalRHost()
    {
        const string url = "http://localhost:8084";
        WebApplication.Start<Startup>(url);
    }
Run Code Online (Sandbox Code Playgroud)

实际发送一些消息的代码:

GlobalHost.ConnectionManager.GetHubContext<PrestoHub>().Clients.All.OnSignalRMessage("snuh");
Console.WriteLine("Sent 'snuh' to all clients...");
Run Code Online (Sandbox Code Playgroud)

我的WPF客户端方法:

    private void InitializeSignalR()
    {
        var hubConnection = new Connection("http://localhost:8084");
        hubConnection.Start();
        hubConnection.Received += OnSignalRMessage;
    }

    private void OnSignalRMessage(string data) …
Run Code Online (Sandbox Code Playgroud)

c# wpf wcf signalr

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

如何在不同的核心上拆分长任务?

我是多线程的新手.我的计算机上有4个逻辑进程,我想在4个不同的核心上的线程中运行4个相同的任务.我该怎么做?我尝试使用BackgroundWorker但是4个BackgroundWorker实例只填充了4个可用的4个核心.我用BackgroundWorker的代码示例:

        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerAsync(calculationParams);
        BackgroundWorker worker1 = new BackgroundWorker();
        worker1.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker1.RunWorkerAsync(calculationParams1);

        BackgroundWorker worker2 = new BackgroundWorker();
        worker2.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker2.RunWorkerAsync(calculationParams2);

        BackgroundWorker worker3 = new BackgroundWorker();
        worker3.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker3.RunWorkerAsync(calculationParams3);
Run Code Online (Sandbox Code Playgroud)

c# multithreading

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

处理方法参数的null属性的最佳方法

检查方法的参数时,ArgumentNullException如果它为null ,则抛出一个 .请参阅以下方法中的第一行.但是参数上的属性应该不为null呢?如果我尝试以相同的方式处理它们,我会收到代码分析错误:

CA2208正确实例化参数异常方法'PriorityDeratingComponentLogic.CreateItem(IvSimulation)'将'ivSimulation.SolarPanel'作为'paramName'参数传递给'ArgumentNullException'构造函数.将此参数替换为方法的参数名称之一.请注意,提供的参数名称应具有方法上声明的确切大小.

public DeratingComponentBase CreateItem(IvSimulation ivSimulation)
{
    if (ivSimulation == null) { throw new ArgumentNullException("ivSimulation"); }
    if (ivSimulation.SolarPanel == null) { throw new ArgumentNullException("ivSimulation.SolarPanel"); }
    if (ivSimulation.GlobalEquipment == null) { throw new ArgumentNullException("ivSimulation.GlobalEquipment"); }

    // ... method body here
}
Run Code Online (Sandbox Code Playgroud)

CA错误是我应该抑制的,还是有一种普遍接受的方式来更好地处理这个问题?也许问题是上游问题,我们甚至不应该检查这些属性是否为空?

c#

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