从不同的后台工作者调用两次自己的WCF Web服务关闭应用程序

时间:2014-04-09 05:38:13

标签: c# wcf backgroundworker

我已经编写了一个小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");
    }
}

1 个答案:

答案 0 :(得分:0)

我刚刚找到了“设计休息”。 按钮的“DialogResult”导致应用程序关闭太快。但奇怪的是调试器没有提前......