【问题标题】:Error throw exception when insert data with thread使用线程插入数据时出错抛出异常
【发布时间】:2015-10-17 04:30:03
【问题描述】:

我在 winform 中使用线程时有问题。 调试程序时出错。

我的应用程序在启动程序时抛出异常。

我定义class RunInUIThread是:

private void RunInUIThread(Delegate method)
{
    this.BeginInvoke(method);
}

并且在 RunInUIThread 方法中像:

BaiXeBUS baixe = new BaiXeBUS();
RunInUIThread(new ThreadStart(delegate ()
{
          BaiXeDTO obj = new BaiXeDTO();      //Map all to define database 
          txtKhuVucBai.Text = mReader.CurrentCardIDBlock1.ToString();
          txtMaThe.Text = mReader.CurrentCardIDBlock2.ToString();

          //If I comment all below code. It's work. But I need Insert data to database.
          txtKhuVucBai.Text = obj.IDBaiXe.ToString();
          txtMaThe.Text = obj.IDRF.ToString();
          obj.BienSoXe = textBox1.Text;
          obj.HinhBienSo = color.ToString();
          obj.HinhChuXe = img.ToString();
          obj.ThoiGianVao = DateTime.Now.ToLocalTime();
          obj.ThoiGianRa = DateTime.Now.ToLocalTime();
          baixe.BaiXe_Insert(obj); //Contain data access layer to insert data with store procedure.
}));

为什么我的代码不起作用。有人可以解释我以及如何解决问题? 感谢所有读者!!!

【问题讨论】:

  • 暂时您可以从ThreadStart 中删除代码块并调试确切的问题所在。从不同的线程开始会使调试变得困难,因此如果可以直接从主 UI 线程运行它,那将是最好的。
  • 看看:在消息框中查看详细信息。 UI 线程_:可能是同步上下文。
  • @JoelLegaspiEnriquez,感谢您的建议。评论此行时。我在下面发现错误评论。
  • 你把这段代码放到表单构造函数中了吗?你能在这段代码运行之前看到表单吗?此错误通常表示尚未创建表单(您可以使用 this.IsHandleCreated 进行检查)。或者你已经关闭了表单并且线程结束了,尝试更新表单但是它被释放了。

标签: c# multithreading winforms exception unhandled-exception


【解决方案1】:

我的意思是尝试在没有ThreadStart 的情况下运行这段代码

{
    BaiXeDTO obj = new BaiXeDTO();      //Map all to define database 
    txtKhuVucBai.Text = mReader.CurrentCardIDBlock1.ToString();
    txtMaThe.Text = mReader.CurrentCardIDBlock2.ToString();

    //If I comment all below code. It's work. But I need Insert data to database.
    txtKhuVucBai.Text = obj.IDBaiXe.ToString();
    txtMaThe.Text = obj.IDRF.ToString();
    obj.BienSoXe = textBox1.Text;
    obj.HinhBienSo = color.ToString();
    obj.HinhChuXe = img.ToString();
    obj.ThoiGianVao = DateTime.Now.ToLocalTime();
    obj.ThoiGianRa = DateTime.Now.ToLocalTime();
    baixe.BaiXe_Insert(obj); //Contain data access layer to insert data with store procedure.
}

这是在主线程中调试您的代码。

【讨论】:

  • 首先,我要感谢@Joel lagaspi Enriquez。是的,我明白了。我创建了新函数InsertDataToBaiXe 并将函数放入事件button_click。这行得通。但我希望它自动运行。我想调用InsertDataToBaiXe的原因是:刷卡时,它会检查并自动分配RFID(mifare卡的id)并自动将RFID添加到数据库中。
  • 您有跨线程操作的可能性吗?据我了解,您的代码在不在不同线程中运行时正在工作。我不确定这是否有帮助,但您可以检查如何进行线程安全调用,或者将其作为开始:msdn.microsoft.com/en-us/library/vstudio/…
  • 感谢您提供的链接。我创建了 3 个在 1 个函数中运行的线程。没关系,直到我使用数据库。它的错误出现了。
【解决方案2】:

@JoelLegaspiEnriquez,你建议我删除 Program.cs 中的 [STAThread]

如果我评论这一行。这在控制 AxLiveX1 中存在问题是相机 ip 的控制。

txtKhuVucBai.Text = mReader.CurrentCardIDBlock1.ToString(); 是 16 字节的 Guid 类型:8d58d690-6b71-4ee8-85ad-006db0287bf1。

但我将 txtKhuVucBai 分配给 Guid 类型是:

private Guid mCurrentCardIDBlock1;
public Guid CurrentCardIDBlock1
{
        get { return mCurrentCardIDBlock1; }
}

mCurrentCardIDBlock1 是 32 个随机字符的 RFID 阅读器。

【讨论】:

  • No 不要删除 [STAThread] 尝试删除 ThreadStart 而不是检查确切的错误。代码太长了不能放在这里,所以我把它作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
相关资源
最近更新 更多