gpt4 book ai didi

c# - 函数在同步调用时有效,但在异步调用时无效

转载 作者:太空狗 更新时间:2023-10-30 01:22:57 24 4
gpt4 key购买 nike

这是我在 StackOverflow 论坛上的第一篇文章,所以请宽容。我对同步调用但不异步调用的函数有疑问。下面你会发现同步调用的函数:

private void issueInvoices(List<int> lista)
{
foreach (int knh_id in lista)
{
Invoice fs = new Invoice();
fs.FKS_AKCYZA = false;
fs.FKS_CZY_KLON = false;
fs.FKS_DATE = Convert.ToDateTime(MTBDataZapisuDoFK.Text);
fs.NUMBER = knh_id);
}
}

如您所见,我将列表传递给名为 issueInvoices 的函数发票编号列表,并在循环中创建了一些发票。此函数正常工作,但如果我尝试异步调用它(以显示进度条),我的函数无法分配给 fs.FKS_DATE 对象 dateTime。看起来静态函数“Convert.ToDateTime”不能正常工作。但是请看下面的代码,其中函数 issueInvoices 是异步调用的……

public delegate void BinaryDelegate(List<int> knh_id);
BinaryDelegate b = new BinaryDelegate(issueInvoices);
IAsyncResult theAsRes = b.BeginInvoke(lista, new AsyncCallback(AddComplete), "Thx U!");
FrmProgressBar fpb=new FrmProgressBar(“Please wait…”);
fpb.Show();

/* below i check how many operation i have to do, if all operations are done, then I close fpb window, program is updating progres bar and in thread make operation issueInvoices*/
while (ilosc_zrobionych != liczbaKontrahentow)
{
fpb.PBStan.Value = (int)((100 * ilosc_zrobionych) / liczbaKontrahentow);
}
fpb.Close();

我放置了一些断点,看起来程序在一行中停止,它可以转换为日期时间,但是当我同步执行此操作时,它可以正常工作而不会出现任何错误。fs.FKS_DATE = Convert.ToDateTime(MTBDataZapisuDoFK.Text);什么可能导致这个问题以及如何解决它?非常感谢您的回复。

下面是异步调用的整个类:

using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Npgsql;
using Castle.ActiveRecord;
using WFR.Model;
using System.Threading;

namespace Faktury_i_Rachunki_2.Forms
{

public partial class FrmEmisjaFakturPotwierdzonych : FrmBaseForm
{

private ArrayList listaSposobowZaplaty;
public List<int> lista;
private int liczbaWygenerowach;
private int liczbaKontrahentow;
private int ilosc_zrobionych;
private FrmProgressBar fpb;

public delegate void BinaryDelegate(List<int> knh_id);


public FrmEmisjaFakturPotwierdzonych()
{
InitializeComponent();
fpb = new FrmProgressBar("Please wait....");
}

private void BtOK_Click(object sender, EventArgs e)
{
BinaryDelegate b = new BinaryDelegate(WyemitujFakture);

lista.Add(12);
lista.Add(13);
lista.Add(17);
lista.Add(1);

liczbaKontrahentow = lista.Count;
if (TBRejestr.Text.Trim() != "")
{

if (liczbaKontrahentow > 0)
{
liczbaWygenerowach = 0;
ilosc_zrobionych = 0;
WyemitujFakture(lista);
IAsyncResult theAsRes = b.BeginInvoke(lista, new AsyncCallback(AddComplete), "THX");

fpb.Show();
while (ilosc_zrobionych != liczbaKontrahentow)
{
fpb.PBStan.Value = (int)((100 * ilosc_zrobionych) / liczbaKontrahentow);
}
fpb.Close();
}

try
{
MessageBox.Show("Wygenerowano " + liczbaWygenerowach.ToString() + " faktur");
}
catch
{
}

}
}
private void WyemitujFakture(List<int> lista)
{
foreach (int knh_id in lista)
{
try
{
if (luk.Count > 0)
{
FakturySprzedazy fs = new FakturySprzedazy();
fs.FKS_AKCYZA = false;
fs.FKS_CZY_KLON = false;
fs.FKS_DATA_DOW_KS = Convert.ToDateTime(MTBDataZapisuDoFK.Text);
fs.FKS_DATA_FAKTURY = Convert.ToDateTime(MTBDataFaktury.Text);
fs.FKS_DATA_SPRZEDAZY = Convert.ToDateTime(MTBDataSprzedazy.Text);
liczbaWygenerowach++;
}

}
catch (Exception ex)
{
MessageBox.Show("Nie można wyemitować faktury dla kontrahenta o id = " + knh_id.ToString() + " " + ex.Message);
}
ilosc_zrobionych++;
}
}

最佳答案

您正在从后台线程访问 UI 控件:

MTBDataZapisuDoFK.Text

这是不允许的。

在调用该方法之前获取此值,将其存储在变量中并将该值作为参数发送到 issueInvoices

关于c# - 函数在同步调用时有效,但在异步调用时无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12436240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com