我已经编写了一个小WCF WebService(.svc),我想从其他应用程序调用它。它到目前为止工作正常。
在另一个应用程序中,我有一个Windows窗体。当显示时,它将调用BackgroundWorker1以从WebService获取对象列表,并在其上显示完成的1方法给用户。到目前为止,非常好。
现在,在用户选择一个对象并单击" ok"之后,BackgroundWorker2将再次调用WebService以收集更多信息。但是在这里,在WebService调用之后的doWork2方法中,整个应用程序中断而没有任何异常或错误。它只是在调用WebService后直接关闭。
这非常奇怪,因为当我查看WebServices日志文件时,它似乎正常工作,并且在关闭其他应用程序之后仍然记录成功操作。因此,我认为WebService不是问题所在。
另一个奇怪的事情:如果我第二次在GUI线程上调用WebService(而不是使用BackgroundWorker2),它就可以了。它阻止了用户界面,但它确实有效。
那么,为什么我的应用程序只是被打破了#34;第二次通话后没有任何通知? 任何想法都非常受欢迎。
提前致谢。
迎接
这里有一些简化的代码。应用程序关闭" 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");
}
}
答案 0 :(得分:0)
我刚刚找到了“设计休息”。 按钮的“DialogResult”导致应用程序关闭太快。但奇怪的是调试器没有提前......