C# 我应该使用线程来提高这些代码的性能吗?
在我的编码中,我希望获得一些性能改进,所以我认为线程是一种选择,但我对多线程和数据共享问题没有信心。有人能检查一下这些代码并给我一些建议吗,谢谢C# 我应该使用线程来提高这些代码的性能吗?,c#,multithreading,C#,Multithreading,在我的编码中,我希望获得一些性能改进,所以我认为线程是一种选择,但我对多线程和数据共享问题没有信心。有人能检查一下这些代码并给我一些建议吗,谢谢 public partial class WorkflowService: IWorkflowService { public void StartProcess(WfAppRunner starter) { try {
public partial class WorkflowService: IWorkflowService
{
public void StartProcess(WfAppRunner starter)
{
try
{
WfRuntimeManager runtimeManager = new WfRuntimeManagerStartup();
runtimeManager.AppRunner = starter;
runtimeManager.Execute();
}
catch (System.Exception)
{
throw;
}
}
}
internal abstract class WfRuntimeManager
{
internal WfAppRunner AppRunner { get; set; }
internal abstract void ExecuteInstance();
internal bool Execute()
{
try
{
Thread thread = new Thread(ExecuteInstance);
thread.Start();
return true;
}
catch (System.Exception)
{
throw;
}
}
}
internal class WfRuntimeManagerStartup : WfRuntimeManager
{
internal override void ExecuteInstance()
{
ISession session = SessionFactory.CreateSession();
try
{
var runner = base.AppRunner;
//do some works with runner, and save works to database.
SaveToDatabase(runner);
...
//do some other works
ProcessOtherWorks();
session.Commit();
}
catch (System.Exception)
{
session.Rollback();
}
finally
{
session.Dispose();
}
}
}
//do some test, minic the true user case
[TestMethod]
public void RunParalleled()
{
//StarterA:
//{"UserID":"10","UserName":"Long","AppName":"SamplePrice","AppInstanceID":"100","ProcessGUID":"072af8c3-482a-4b1c-890b-685ce2fcc75d"}
var starterA = new WfAppRunner();
starterA.ProcessGUID = Guid.Parse("072af8c3-482a-4b1c-890b-685ce2fcc75d");
starterA.UserID = 10;
starterA.UserName = "Long";
//SarterB:
//{"AppName":"Offin","AppInstanceID":587,"UserID":"0021","UserName":"test2","ProcessGUID":"68696ea3-00ab-4b40-8fcf-9859dbbde378","FlowStatus":null,"Conditions":{"surplus":"aa"}}
var starterB = new WfAppRunner();
starterB.ProcessGUID = Guid.Parse("68696ea3-00ab-4b40-8fcf-9859dbbde378");
starterB.UserID = 21;
starterB.UserName = "test2";
IWorkflowService serviceA, serviceB;
for (var i = 0; i < 5000; i++)
{
serviceA = new WorkflowService();
starterA.AppName = "Price";
starterA.AppInstanceID = i;
serviceB = new WorkflowService();
starterB.AppName = "Offin";
starterB.AppInstanceID = i;
//execute process instance
serviceA.StartProcess(starterA);
serviceB.StartProcess(starterB);
}
}
公共部分类WorkflowService:IWorkflowService
{
公共无效启动程序(WFAPRunner启动程序)
{
尝试
{
WfRuntimeManager runtimeManager=新建WfRuntimeManager启动();
runtimeManager.AppRunner=starter;
runtimeManager.Execute();
}
捕获(系统异常)
{
投掷;
}
}
}
内部抽象类WfRuntimeManager
{
内部WfAppRunner AppRunner{get;set;}
内部抽象void ExecuteInstance();
内部bool执行()
{
尝试
{
线程线程=新线程(ExecuteInstance);
thread.Start();
返回true;
}
捕获(系统异常)
{
投掷;
}
}
}
内部类WfRuntimeManager启动:WfRuntimeManager
{
内部重写void ExecuteInstance()
{
ISession session=SessionFactory.CreateSession();
尝试
{
var runner=base.AppRunner;
//使用runner执行一些工作,并将工作保存到数据库。
SaveToDatabase(runner);
...
//做一些其他的工作
ProcessOtherWorks();
Commit();
}
捕获(系统异常)
{
session.Rollback();
}
最后
{
session.Dispose();
}
}
}
//做一些测试,了解真实的用户案例
[测试方法]
public void RunParalleled()
{
//起动器A:
//{“UserID”:“10”,“UserName”:“Long”,“AppName”:“SamplePrice”,“AppInstanceID”:“100”,“ProcessGUID”:“072af8c3-482a-4b1c-890b-685CE2C75D”}
var starterA=新的WfAppRunner();
starterA.ProcessGUID=Guid.Parse(“072af8c3-482a-4b1c-890b-685CE2C75D”);
starterA.UserID=10;
start a.UserName=“Long”;
//萨特布:
//{“AppName”:“Offin”,“AppInstanceID”:587,“UserID”:“0021”,“UserName”:“test2”,“ProcessGUID”:“68696ea3-00ab-4b40-8fcf-9859DBD378”,“FlowStatus”:null,“Conditions”:{“盈余”:“aa”}
var starterB=新的WfAppRunner();
starterB.ProcessGUID=Guid.Parse(“68696ea3-00ab-4b40-8fcf-9859dbbde378”);
starterB.UserID=21;
starterB.UserName=“test2”;
IWorkflowService服务A、服务B;
对于(变量i=0;i<5000;i++)
{
serviceA=新的工作流服务();
start a.AppName=“价格”;
启动器A.AppInstanceID=i;
serviceB=新的工作流服务();
starterB.AppName=“Offin”;
启动器B.AppInstanceID=i;
//执行流程实例
服务A.启动流程(启动程序A);
服务B.启动流程(启动器B);
}
}
如果没有关于线程将处理什么的信息,很难说清楚,但确实如此。在处理数据时,多线程可能是危险的。实际上,您的主要性能提升可能在于代码本身,分析您的方法以找出哪些方法花费的时间最多,例如迭代发生的位置等。然后将该方法作为问题方法发布在此处。嗨,Opata,谢谢您的回复。因为ExecuteInstance()方法处理大量事务,使系统运行缓慢,所以我想让该方法在多线程之间并行运行。@贝斯利:当您为每个线程提供自己的状态或数据时,多线程可以极大地提高性能。您所说的“事务”是什么意思?如果你的程序正在重击硬盘,那么多线程可能会使它变得更慢。嗨,saravanan:它会避免数据共享问题还是不需要锁定对象?我想试着解决这个问题。谢谢@svinja:这确实是一个很长的事务,会将数据写入数据库。因为会有更多的并发用户来运行程序,所以我需要提高性能。