2014-04-09 39 views
0

我已經編寫了一個我想從其他應用程序調用的小型WCF WebService(.svc)。目前工作狀況良好。從不同的BackgroundWorkers調用自己的WCF WebService關閉應用程序

在另一個應用程序中,我有一個Windows窗體。顯示時,它將調用BackgroundWorker1從WebService獲取對象列表,並將其顯示給用戶已完成的方法。到現在爲止還挺好。

現在,用戶選擇一個對象並點擊「ok」後,BackgroundWorker2將再次調用WebService以收集更多信息。但是在這裏,在WebService調用之後的doWork2方法中,整個應用程序沒有任何異常或錯誤。它只是在調用WebService之後關閉。

這很奇怪,因爲當我看看WebServices日誌文件時,它似乎正常工作,並且在另一個應用程序關閉後仍然記錄成功的操作。所以WebService不可能是我想的問題。

另一個奇怪的事情:如果我第二次在GUI線程(而不是BackgroundWorker2)上調用WebService,它就會起作用。它阻止用戶界面,但它的工作原理。

那麼,爲什麼我的應用程序只是在第二次調用後「斷開」而沒有任何通知? 任何想法都非常受歡迎。

在此先感謝。

Greets

這是一些簡化的代碼。該應用程序在「bgwGetSingleCar_DoWork」關閉:

public partial class MyForm : Form 
{ 

    private Controller _ctrl { get; set; } 
    private Config _config { get; set; } 
    private List<Cars> _cars { get; set; } 
    public bool Result { get; private set; } 

    public MyForm(Controller ctrl, Config config) 
    { 
     this._ctrl = ctrl; 
     this._config = config; 
     this.Result = false; 
     InitializeComponent(); 
    } 

    private void MyForm_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      this.bgwGetAllOffers.RunWorkerAsync(new WorkerInfo() 
      { 
       WorkerType = WorkerType.Type1, 
       IdLocal = this._config.IdLocal, 
       IdExternal = this._config.IdExternal, 
      }); 
     } 
     catch (Exception ex) 
     { 
      // ... 
     } 
    } 

    private void FillList(List<Cars> list) 
    { 
     // ... 
    } 

    private void btnOk_Click(object sender, EventArgs e) 
    { 
     CarListItem v = (CarListItem)this.lstBoxCars.SelectedValue; 
     this._config.IdExternal = v.IdExternal; 

     try 
     { 
      this.bgwGetSingleCar.RunWorkerAsync(new WorkerInfo() 
      { 
       WorkerType = WorkerType.Type2, 
       IdLocal = this._config.IdLocal, 
       IdExternal = this._config.IdExternal, 
      }); 
     } 
     catch (Exception ex) 
     { 
      // ... 
     } 
    } 

    private void bgwGetAllCars_DoWork(object sender, DoWorkEventArgs e) 
    { 
     try 
     { 
      WorkerInfo info = (WorkerInfo)e.Argument; 
      Client client = new Client(); 
      GetCarsResult result = client.GetAllCars(new GetAllCarsRequest() 
      { 
       IdLocal = info.IdLocal, 
       IdExternal = info.IdExternal 
      }); 

      if (!result.Success) 
      { 
       // ... 
      } 

      if (result.Cars != null) 
      { 
       this._cars = result.Cars.ToList(); 
      } 
     } 
     catch (Exception ex) 
     { 
      /// ... 
     } 
    } 

    private void bgwGetAllCars_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     this.FillList(this._cars); 
    } 

    private void bgwGetSingleCar_DoWork(object sender, DoWorkEventArgs e) 
    { 
     try 
     { 
      WorkerInfo info = (WorkerInfo)e.Argument; 
      Client client = new Client(); 

      // Application closes after this line, but WebService log still shows  activity 
      GetCarsResult result = client.GetSingleCar(new GetSingleCarRequest() 
      { 
       IdLocal = info.IdLocal, 
       IdExternal = info.IdExternal 
      }); 

      if (result.Success) 
      { 
       this.Result = true; 
      } 
     } 
     catch (Exception ex) 
     { 
      /// ... 
     } 
    } 

    private void bgwGetSingleOffer_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     this.DialogResult = System.Windows.Forms.DialogResult.OK; 
    } 
} 

public class CarListItem : Car 
{ 
    public override string ToString() 
    { 
     return ((DateTime)this.LastUpdate).ToString("dd.MM.yyyy - HH:mm"); 
    } 
} 
+1

沒有任何代碼可以看,這可能是關於任何東西。 – nvoigt

+0

我希望我的應用程序的「已知」設計突破。我會在我有時間編輯代碼時編輯代碼。謝謝。 – Sleepwalker

+0

代碼在那裏,我仍然卡住。有任何想法嗎? – Sleepwalker

回答

0

我剛剛發現我的「設計突破」。 這是導致應用程序過早關閉的按鈕的「DialogResult」。但奇怪的是,調試器沒有提前...