从不同的BackgroundWorkers两次调用自己的WCF WebService将关闭应用程序
本文关键字:WCF 自己的 调用 WebService 应用程序 两次 BackgroundWorkers | 更新日期: 2023-09-27 17:57:35
我已经编写了一个小型WCF WebService(.svc),我想从其他应用程序调用它。到目前为止运行良好。
在另一个应用程序中,我有一个Windows窗体。当它显示时,它将调用BackgroundWorker1从WebService中获取对象列表,并在其completed1方法上向用户显示。到目前为止,一切都很好。
现在,在用户选择一个对象并单击"ok"后,BackgroundWorker2将再次调用WebService来收集更多信息。但是在这里,在WebService调用之后的doWork2方法中,整个应用程序中断,没有任何异常或错误。它只是在调用WebService之后直接关闭。
这非常奇怪,因为当我查看WebServices日志文件时,它似乎正常工作,并且在其他应用程序关闭后仍然记录成功的操作。因此,我认为WebService不可能是问题所在。
另一件奇怪的事情是:如果我在GUI线程上第二次调用WebService(而不是使用BackgroundWorker2),它就可以工作了。它阻止了用户界面,但它可以工作。
那么,为什么我的应用程序在第二次调用后就"坏了"而没有任何通知呢?任何想法都非常受欢迎。
提前谢谢。
问候
这里有一些简化的代码。应用程序在"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");
}
}
我刚刚发现了我的"设计突破"。正是按钮的"DialogResult"导致应用程序过早关闭。但奇怪的是调试器没有提前一步。。。