业务逻辑封装在同步服务调用之后,例如:
interface IFooService
{
Foo GetFooById(int id);
int SaveFoo(Foo foo);
}
Run Code Online (Sandbox Code Playgroud)
以异步方式扩展/使用这些服务调用的最佳方法是什么?
目前我已经创建了一个简单的AsyncUtils类:
public static class AsyncUtils
{
public static void Execute<T>(Func<T> asyncFunc)
{
Execute(asyncFunc, null, null);
}
public static void Execute<T>(Func<T> asyncFunc, Action<T> successCallback)
{
Execute(asyncFunc, successCallback, null);
}
public static void Execute<T>(Func<T> asyncFunc, Action<T> successCallback, Action<Exception> failureCallback)
{
ThreadPool.UnsafeQueueUserWorkItem(state => ExecuteAndHandleError(asyncFunc, successCallback, failureCallback), null);
}
private static void ExecuteAndHandleError<T>(Func<T> asyncFunc, Action<T> successCallback, Action<Exception> failureCallback)
{
try
{
T result = asyncFunc();
if (successCallback != …
Run Code Online (Sandbox Code Playgroud) 我最近阅读了有关Windows异常处理的以下内容.
在某些未处理的异常中,例如双栈故障,操作系统将立即终止应用程序而不调用未处理的异常过滤器或JIT调试器.
什么是双栈故障?它与常规堆栈错误有何不同?
如何使用RDBMS存储逻辑表达式?
我标记对象,并希望能够基于这些标记构建真值语句.(这些可能被视为虚拟标签.)
标签
new
for_sale
used
offer
规则
second_hand_goods = (!new or used) and for_sale
new_offer = new and offer
second_hand_offer = second_hand_goods and offer
你们如何在数据库中存储表达式和业务规则?
提前致谢.
更新
要清楚,规则不是由数据库在内部使用,而是由需要持久保存这些标记和规则的外部应用程序创建和使用.谢谢.
如何从C#中的表达式获取第一个方法的名称?类似下面的虚构MethodUtils.NameFromExpression():
Expression<Action<string>> expr = s => s.Trim();
Assert.AreEqual("Trim", MethodUtils.NameFromExpression(expr));
Run Code Online (Sandbox Code Playgroud)
理想情况下,任何util方法都将以这样一种方式编写/重载,即它可以为任何Action或Func委托类型提供表达式.
提前致谢.
UPDATE
我找到了答案(下面),但仍然想知道这是否是一个好的解决方案,或者是否已经存在在BCL中执行此操作的方法.
假设我有以下表达式:
Expression<Action<T, StringBuilder>> expr1 = (t, sb) => sb.Append(t.Name);
Expression<Action<T, StringBuilder>> expr2 = (t, sb) => sb.Append(", ");
Expression<Action<T, StringBuilder>> expr3 = (t, sb) => sb.Append(t.Description);
Run Code Online (Sandbox Code Playgroud)
我希望能够将这些编译成与以下内容等效的方法/委托:
void Method(T t, StringBuilder sb)
{
sb.Append(t.Name);
sb.Append(", ");
sb.Append(t.Description);
}
Run Code Online (Sandbox Code Playgroud)
解决这个问题的最佳方法是什么?我希望它表现良好,理想情况下性能与上述方法相当.
更新 所以,虽然似乎没有办法在C#3中直接执行此操作,有没有办法将表达式转换为IL,以便我可以将它与System.Reflection.Emit一起使用?
我曾经很好地利用了Java的ThreadPoolExecutor类,并且还没有在C#中找到一个好的等价物.我知道ThreadPool.QueueUserWorkItem在许多情况下很有用,但是如果你想控制分配给一个任务的线程数或者为不同的任务类型有多个单独的队列,那就不好了.
例如,我喜欢使用带有单个线程的ThreadPoolExecutor来保证异步调用的顺序执行.在C#中有一种简单的方法吗?是否存在非静态线程池实现?
我正在启动一个公开WCF端点的子进程.如何从子进程向父进程发出信号,表明子进程已完全初始化并且现在可以访问端点?
我想过为此目的使用信号量,但无法弄清楚如何实现所需的信号.
string pipeUri = "net.pipe://localhost/Node0";
ProcessStartInfo startInfo = new ProcessStartInfo("Node.exe", "-uri=" + pipeUri);
Process p = Process.Start(startInfo);
NetNamedPipeBinding binding = new NetNamedPipeBinding();
var channelFactory = new ChannelFactory<INodeController>(binding);
INodeController controller = channelFactory.CreateChannel(new EndpointAddress(pipeUri));
// need some form of signal here to avoid..
controller.Ping() // EndpointNotFoundException!!
Run Code Online (Sandbox Code Playgroud) 非常简单.什么是最快的正则表达式将返回任何输入的真实?
编辑:为什么下来投票?似乎是一个非常合理的问题.我使用一个带有正则表达式过滤器的函数,我想知道什么能使它最快地匹配所有内容."不使用正则表达式"不是一个答案.
订阅事件时,AppDomain.CurrentDomain.UnhandledException
什么标准导致UnhandledExceptionEventArgs
IsTerminating
标志为真?是什么导致异常被视为致命?
是否会出现这种情况,除非另有配置,否则所有未处理的异常都将是致命的?
为了追踪一些难以重现的崩溃,我已经配置了UnhandledExceptionFilter
如下所述创建迷你转储文件:调试自定义过滤器以处理未处理的异常和有效的小型转储
转储正在成功捕获,但我没有太多运气解释堆栈信息.希望其他人能够体验到类似的东西,我将在下面提供尽可能多的细节.对不起,如果这个问题结果有点冗长.
Visual Studio提供以下转储摘要:
Dump Summary
------------
Dump File: MiniDump.dmp
Last Write Time: 15/08/2012 22:07:22
Process Name: Server.exe : C:\Project\Server.exe
Process Architecture: x86
Exception Code: 0xC0000005
Exception Information: The thread tried to read from or write to a virtual address for which it does not have the appropriate access.
Heap Information: Not Present
System Information
------------------
OS Version: 6.1.7601
CLR Version(s):
Modules
-------
Module Name Module Path Module Version
----------- ----------- --------------
Server.exe C:\Project\Server.exe …
Run Code Online (Sandbox Code Playgroud)