我有一种情况,为了测试,我只希望我的计时器方法(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可以访问的其他类中?
是否有一种普遍接受的编码复杂数学的最佳方法?例如:
double someNumber = .123 + .456 * Math.Pow(Math.E, .789 * Math.Pow((homeIndex + .22), .012));
Run Code Online (Sandbox Code Playgroud)
这是一个硬编码数字的点吗?或者每个数字是否都有与之相关的常数?或者是否有另一种方式,比如在config中存储计算并以某种方式调用它们?
会有很多像这样的代码,我试图让它保持可维护性.
注意:上面显示的示例只是一行.这些代码行将有数十或数百行.不仅数字会改变,而且公式也可以改变.
我有两个实现ISomeBehavior的类.现在我希望他们分享功能.通常我会用一个抽象类替换ISomeBehavior,比如SomeBehaviorBase.问题是其中一个子类已经从另一个类派生,而另一个类不是我们拥有的软件.(这是C#,因此多重继承不是一种选择.)从第三方类派生的子类没有实现.它只是派生自第三方类,并实现了ISomeBehavior,因此第三方类的处理方式与实现ISomeBehavior的其他子类相同.
我目前所做的是在ISomeBehavior上实现一个扩展方法.现在消费代码可以调用该方法.这种方法的问题是我想强制调用代码使用这个扩展方法.我无法从界面中删除SomeMethod(),因为扩展方法最终必须调用它.
关于如何让两个类优雅地分享相同的行为的任何想法,当其中一个已经派生自另一个,第三方,类?注意:策略设计模式在这里听起来很有意义,但是当子类之间的行为发生变化时会使用该模式.这里的行为没有变化; 它只需要分享.
我必须遗漏一些东西......如何抛出异常,但异常后的代码仍会在调试器中被击中?
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) 我正在尝试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) 我刚刚在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在他的回答中解释这一点.
我有一个数据访问类,花了我一段时间才能开始工作.对于我的应用程序,我需要获得不同类型的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) 我一直在尝试让我的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) 我是多线程的新手.我的计算机上有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) 检查方法的参数时,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错误是我应该抑制的,还是有一种普遍接受的方式来更好地处理这个问题?也许问题是上游问题,我们甚至不应该检查这些属性是否为空?