Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该使用线程来提高这些代码的性能吗?_C#_Multithreading - Fatal编程技术网

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:这确实是一个很长的事务,会将数据写入数据库。因为会有更多的并发用户来运行程序,所以我需要提高性能。