C# 我应该用线吗?

C# 我应该用线吗?,c#,.net,winforms,C#,.net,Winforms,我目前正在开发一个销售点程序,许多使用同一本地数据库的计算机可能会使用该程序 我问下面的问题是因为现在我已经把所有的东西都设置好了,所以一次只有一台计算机使用这个程序,这实际上很幼稚。然而,我还想知道我是否真的可以在这个平台上实现线程和锁之类的东西,或者我只是在浪费时间和宝贵的资源 谁能告诉我?非常感谢。我将添加可能由不同进程运行的摘录代码: private void PuntoDeVenta_Load(object sender, EventArgs e) { //C

我目前正在开发一个销售点程序,许多使用同一本地数据库的计算机可能会使用该程序

我问下面的问题是因为现在我已经把所有的东西都设置好了,所以一次只有一台计算机使用这个程序,这实际上很幼稚。然而,我还想知道我是否真的可以在这个平台上实现线程和锁之类的东西,或者我只是在浪费时间和宝贵的资源

谁能告诉我?非常感谢。我将添加可能由不同进程运行的摘录代码:

 private void PuntoDeVenta_Load(object sender, EventArgs e)
    {
        //Connect to the local database and check if we successfully connected.
        conn = new ConexionBD();
        if (!conn.conectar())
        {
            MessageBox.Show("Hubo un error al conectarse a la base de datos. Favor de verificar.", "Error", MessageBoxButtons.OK);
            this.Close();
        }
        comboBox1.SelectedIndex = 0;
        groupBox3.Enabled = false;
        this.KeyUp += new System.Windows.Forms.KeyEventHandler(KeyEvent);
        string[] detalle = conn.informacionEmpresa();
        iva = Convert.ToInt16(detalle[10]);
        label15.Text = "Impuesto (" + iva + "%):";
        //Get the highest order number until now. Not sure if I need to use Thread here.
        String maxPedido = conn.detalleNumeroPedidoMasReciente();
        int n;
        if (int.TryParse(maxPedido, out n))
        {
            maxPedido = (n + 1).ToString();
        }
        else
        {
            n = Convert.ToInt32(Regex.Match(maxPedido, @"\d+").Value);
            String nonNumeric = String.Concat(maxPedido.Where(c => !Char.IsDigit(c)));
            maxPedido = nonNumeric + (n + 1).ToString();
        }
        textBox1.Text = maxPedido;
    }

想想你为一家企业雇佣员工的方式。你什么时候为企业雇佣工人只有在你有很多工作要做的时候,因为招聘很昂贵

理想情况下,您应该仅在满足以下条件时创建新线程:

  • 要做的工作是CPU密集型的
  • 工作时间很长——肯定超过30毫秒,更像是几秒钟或几分钟的工作
  • 有一个空闲的CPU,可以100%专用于服务该线程
在您的情况下,看起来您正在考虑雇用一名工作人员来运行数据库查询。那么,你会为你的公司雇佣一个工人,他唯一的工作就是什么都不做,只发送一封信,然后付钱让他们在等待答复时睡觉吗?当然不是。所以,也不要雇佣线程来做这件事。如果您要做的是不受CPU限制的高延迟工作,在单个线程上创建一个异步工作流


异步工作流不会雇用新员工。更确切地说,这就像你发了一封信,当你等待答复时,你会发现其他工作要做,从而有效地利用你的时间。当回复到达时,您将继续您停止的“信函工作流程”。

重点是,现在让我们为工作人员添加另一个作业:我想向此订单添加项目,尤其是当其他人向其他不同的订单添加项目时。PS:抱歉,如果这听起来很无聊的话,我是一个有点无聊的人this@JulioGarcia:如果操作所需时间少于30毫秒,则将其设置为同步单线程。如果需要超过30毫秒,但不消耗CPU,则将其设置为单线程异步。如果需要30毫秒以上的时间并在整个时间内占用CPU,请将工作分配给工作线程并使工作流异步。@JulioGarcia:多线程工作流不适用于noobs。它们是C#中最难纠正的事情之一。如果可能的话,我会尽量避免使用多线程工作流。如果我不能,我会尽量只在我有大量CPU密集型工作的情况下使用它们。在WinForms中,你肯定会(应该)“为你的企业雇用一名工人,他的唯一工作就是什么都不做,只发送一封信,然后付钱让他们在等待答复时睡觉?”,当它将解除主GUI线程的负担时。@HenkHolterman:在一个设计良好的事件驱动程序中,IO操作一开始就没有阻塞;它要么在操作完成时生成事件,要么返回您可以等待的任务。浪费一个线程来执行IO是一个糟糕设计的标志,我们应该努力避免创建需要它的API。您的
PuntoDeVenta\u Load
混合了UI和Db代码。你得先把它分开。