2012-09-15 2 views
4

이것이 StackOverflow 포럼의 첫 번째 게시물이므로 매우 관대하십시오. 동기식으로 호출되는 함수에 문제가 있지만 비동기식으로 호출되지 않습니다. 당신은 내가 송장 번호의 이름 issueInvoices 목록을 작동하려면 목록을 통과 루프에서 내가 어떤 송장을 작성 볼 수 있듯이함수는 동 기적으로 호출 될 때 작동하지만 비동기 적으로 호출 될 때는 작동하지 않습니다.

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); 
     } 
    } 

: 당신 아래 은 동 기적으로 호출 된 함수를 찾을 수 있습니다. 이 함수는 제대로 작동하지만 비동기 적으로 (진행률 표시 줄을 표시하기 위해) 호출하려고하면 함수가 fs.FKS_DATE 객체 dateTime에 할당 할 수 없습니다. 정적 함수 "Convert.ToDateTime"이 제대로 작동하지 않는 것 같습니다. 그러나

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(); 

가 좀 중단 점을 넣어 기능 issueInvoices가 비동기 적으로 호출되는 코드 아래에 모습을 ... 가지고 가고 라인에서 프로그램을 stoping처럼 보이는하십시오, 그것은 날짜에 Conver 유럽 수 있습니다,하지만 난 기적이 작업을 수행 할 때, 그것은 작동 어떤 오류도없이. fs.FKS_DATE = Convert.ToDateTime (MTBDataZapisuDoFK.Text); 이 문제를 해결할 수있는 방법과 해결 방법은 무엇입니까? 미리 답변 해 주셔서 감사합니다. 아래

은 학급 전체 비동기이라고 : 한 배경 스레드에서 UI 컨트롤을 액세스

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++; 
      } 
     } 
+1

이 매우 귀찮은 코드입니다. BackgroundWorker를 사용하도록 다시 작성하고 문제가 계속되면 다시 게시하십시오. –

답변

1

문제는 MTBDataZapisuDoFK.Text (텍스트 상자로 가정) 값을 얻는 데 있습니다. 텍스트 상자의 텍스트를 가져 오거나 설정한다는 것은 해당 창에 메시지를 보내는 것을 의미합니다. 그러나 UI 루프는 while 루프에서 계속 사용하므로 메시지를 처리 ​​할 수 ​​없습니다.

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

I 비동기 메소드를 호출하는 유일한 이유는 WyemitujFakture 처리 중에 UI를 업데이트 할 수 있음을 가정

메시지가 처리 될 수 있도록 while 루프로 Application.DoEvents()로 전화를 넣어 -방법. 당신이 asynchonous 전화를하지 않아도 Application.DoEvents() 사용 : 양식이 제대로 표시 할 수 있도록 fpb.Show()를 호출 한 후

fpb = new FrmProgressBar("Please wait...."); 
fpb.Show(); 
Application.DoEvents(); 
WyemitujFakture(lista); 
fpb.Close(); 

당신은 Application.DoEvents()를 호출해야합니다. 또한 fpb.Close()을 호출 한 후에 동일한 인스턴스를 다시 사용할 수 없기 때문에 생성자 대신 메서드 자체에서 폼을 인스턴스화해야합니다 (삭제됨).

그런 다음 당신은 WyemitujFakture -method에서 진행률 표시 줄을 업데이트 할 수 있습니다

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 mozna wyemitowac faktury dla kontrahenta o id = " + knh_id.ToString() + " " + ex.Message); 
     } 
     ilosc_zrobionych++; 

     fpb.PBStan.Value = (int)((100 * ilosc_zrobionych)/liczbaKontrahentow); 
     Application.DoEvents(); 
    } 
} 
+0

다시 한 번 안녕하세요. 힌트를 확인했는데 진행률 표시 줄이 올바르게 작동하고 의견이 무엇이 잘못되었는지 이해하는 데 도움이됩니다. 다시 한번 감사 드리며 좋은 하루 되세요 !!! 종류 감사합니다. – JacekRobak85

3

: 허용되지

MTBDataZapisuDoFK.Text 

.

메서드를 호출하기 전에이 값을 가져 와서 변수에 저장하고이 값을 인수로 issueInvoices에 보냅니다.

+0

그렇지 않습니다. Text 속성을 작업자로부터 읽을 수 있습니다. 작성되지 않았습니다. –

관련 문제