我的事件调度程序类通过实现一些信号槽设计模式松散地耦合其他类的实例.
应用程序中只应存在一个唯一的事件调度程序.由于我的Dispatcher类 - 它完成了所有工作 - 继承自Dictionary<TKey, TValue>,因此不能将其声明为静态.
为了克服这个限制,我实现了一个主要的静态包装类EVD与私有财产evd提供了Dispatcher单,与公众的静态方法一起Subscribe,UnSubscribe和Dispatch,其包装单身的相应的方法:
namespace EventDispatcher
{
public static class EVD
{
static Dispatcher evd { get { return Singleton<Dispatcher>.Instance; } }
public static void Subscribe(string name, EvtHandler handler)
{
evd.Subscribe(name, handler);
}
public static void UnSubscribe(string name, EvtHandler handler = null)
{
evd.UnSubscribe(name, handler);
}
public static void Dispatch(string name, object sender, EvtArgs e = null)
{
evd.Dispatch(name, sender, …Run Code Online (Sandbox Code Playgroud) 我的ASP.NET自定义列表控件从数据库中获取其值View.检索数据的方法最终返回类型的对象List<Triplet>作为控件的DataSource.
我想出了该方法的三种可能的实现方式,它们似乎都能正常工作并给出相同的结果.现在我不确定哪一个应该是首选.
关键是,我需要按字母顺序查询查询中的唯一字符串,并且db中有许多重复项.所以我可以获取它们然后执行Distinct()以获取唯一值...
public override object GetData()
{
return
(
from name in
(
from job in DBConnection.NewDataContext.vJobs
where job.name != null
select job.name
).Distinct().OrderBy(s => s)
select new Triplet(name, name, ListType)
).ToList();
}
Run Code Online (Sandbox Code Playgroud)
...或者我可以使用group by子句,只选择键:
public override object GetData()
{
return
(
from job in DBConnection.NewDataContext.vJobs
where job.name != null
group job by job.name into names
orderby names.Key
select new Triplet(names.Key, names.Key, ListType)
).ToList();
}
Run Code Online (Sandbox Code Playgroud)
我还提出了以下内容,它使用了EqualityComparerTriplets 的特殊功能.实际上这是我的第一个方法,但我并不喜欢它:
public override object GetData() …Run Code Online (Sandbox Code Playgroud) 我有一个C#类,可以使用不同的构造函数进行实例化,但它也包含一些静态帮助器方法,这些方法只能使用它们的参数,也可以从其他类中调用.
现在我想知道从不同线程到这样一个方法的并发调用是否是线程安全的,或者换句话说,静态方法中的变量是否可能被call2改变,而call1仍在进行中?
public class AwesomeClass
{
/* constructors and stuff */
public static bool HelperMethod(object o1)
{
string someString = "";
Func<object, string> doSomething = (o) => {
string someOtherString == null;
if (someString.Length == 0)
{
/* time consuming process using o... frequently
changes someString and someOtherString */
}
return someOtherString;
};
return doSomething(o1).Length > 0 && someString.Length < 10;
}
}
Run Code Online (Sandbox Code Playgroud)
如果someString在示例中可以通过thread2调用来更改,HelperMethod而doSomething仍然在为thread1工作,那我就麻烦了.