我已經編寫了一個我想從其他應用程序調用的小型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");
}
}
沒有任何代碼可以看,這可能是關於任何東西。 – nvoigt
我希望我的應用程序的「已知」設計突破。我會在我有時間編輯代碼時編輯代碼。謝謝。 – Sleepwalker
代碼在那裏,我仍然卡住。有任何想法嗎? – Sleepwalker