C# 在单独的线程上有条件地运行类的方法
我有一个将日志信息保存到数据库的类(在NServiceBus消息C# 在单独的线程上有条件地运行类的方法,c#,.net,multithreading,C#,.net,Multithreading,我有一个将日志信息保存到数据库的类(在NServiceBus消息Handle方法中) 大多数情况下,日志记录可以在主进程的单独线程(和事务)上完成。但这一切都需要在同一个后台线程上完成(这意味着它们必须按顺序完成,只是不能与主进程同步) 但是,一旦它开始对来自NServiceBus的实际数据进行外键控,它就需要位于同一线程上 下面是一些示例代码: public class MyExample { public void LogSomeStuff(Stuff stuff) {
Handle
方法中)
大多数情况下,日志记录可以在主进程的单独线程(和事务)上完成。但这一切都需要在同一个后台线程上完成(这意味着它们必须按顺序完成,只是不能与主进程同步)
但是,一旦它开始对来自NServiceBus的实际数据进行外键控,它就需要位于同一线程上
下面是一些示例代码:
public class MyExample
{
public void LogSomeStuff(Stuff stuff)
{
using (MoveOutsideTransaction())
{
// Do Method Stuff here
dataAccess.SaveChanges();
}
}
public void LogSomeOtherStuff(Stuff stuff)
{
using (MoveOutsideTransaction())
{
// Do Other Method Stuff here
dataAccess.SaveChanges();
}
}
private IDisposable MoveOutsideTransaction()
{
if (loggingOutsideTransaction)
return new TransactionScope(TransactionScopeOption.Suppress);
return null;
}
}
我想知道是否有一种方法可以使用我的事务条件也有条件地将运行转移到另一个线程。(但仅当它抑制事务时。)
我想知道是否有一种方法可以使用我的交易条件
还可以有条件地将运行移动到其他线程
不能只将方法的执行移到另一个线程上。线程通常不会以这种方式工作。但是,您可以做的是设置一个专用线程,该线程可以参与封送处理操作,该操作或多或少模拟执行转移到另一个线程。重要的是要明确这一点,即必须对专用线程进行特殊编码,以接受此封送处理操作
下面是它的工作原理
public class DedicatedThread
{
private BlockingCollection<Action> actions = new BlockingCollection<Action>();
public DedicatedThread()
{
var thread = new Thread(
() =>
{
while (true)
{
Action action = actions.Take();
action();
}
});
}
public void SubmitAction(Action action)
{
actions.Add(action);
}
}
这看起来不错,但我的许多方法都有几个参数。大多数是
string
s和int
s,但我需要将它们传递进来。有没有一种方法可以通过这种设置来实现这一点?(这似乎只是调用该方法,但不允许每次调用都使用参数。)@Vaccano:您可以使用Action
。或者,当通过lambda表达式构建操作
委托时,可以对变量执行闭包。
if (loggingOutsideTransaction)
{
// Execute asynchronously on a dedicated thread.
dedicatedThread.SubmitAction(yourActionDelegate);
}
else
{
// Execute synchronously.
yourActionDelegate();
}