从不同的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");
    }
}

从不同的BackgroundWorkers两次调用自己的WCF WebService将关闭应用程序

我刚刚发现了我的"设计突破"。正是按钮的"DialogResult"导致应用程序过早关闭。但奇怪的是调试器没有提前一步。。。