在两个连续的呼叫之间延迟

时间:2014-05-07 13:23:34

标签: c# silverlight wcf-ria-services

使用Silverlight 5,RIA服务1.0和Telerik控件我有一个带有按钮的对话框,点击该按钮后会运行一些服务代码。 问题是,当我快速双击或三击它时,它会一直调用服务,从而出现此错误:

System.InvalidOperationException: 
System.InvalidOperationException: A SubmitChanges operation is already in progress on this DomainContext.

我想知道这是否是一个常见的错误,是否有任何解决方法?

以下是导致崩溃的.NET源代码:

 public virtual SubmitOperation SubmitChanges(Action<SubmitOperation> callback, object userState)
    {
      if (this.IsSubmitting)
        throw new InvalidOperationException(Resource.DomainContext_SubmitAlreadyInProgress);

3 个答案:

答案 0 :(得分:2)

这不是错误。 submitChange操作是异步的,因此您必须在执行其他操作之前检测到它已完成。

一种解决方案可能是阻止用户在操作完成之前单击按钮。

由于您使用的是Telerik控件,因此可以使用忙碌指示器。

private void btnUserAction_Click(object sender, RoutedEventArgs e)
{
    myBusyIndicator.IsBusy = true;

    // DO your stuff

    var submitOperation = myContext.SubmitChanges();

    submitOperation.Completed += (s, e) =>
        {
          // It is completed, now the user can click on the button again 

          myBusyIndicator.IsBusy = false;
         }
}

编辑:繁忙的指标应该在您的Xaml中定义,如下所示:

<Telerik:RadBusyIndicator x:Name="myBusyIndicator">
            <Grid x:Name="LayoutRoot" >
                 <Button Name="btnUserAction" Click="btnUserAction_Click" />
            </Grid>
</Telerik:RadBusyIndicator>

答案 1 :(得分:1)

我有同样的问题。所以我在ViewModel上创建了一个属性,并将其绑定到我的按钮的IsEnabled属性。我在保存开始时将其设置为false,并在完成时将其设置为true。

<Button Content="Save" IsEnabled="{Binding FinishedDataTransfer}" ...

bool _finishedDataTransfer = false;
public bool FinishedDataTransfer
{
    get { return _finishedDataTransfer; }
    set
    {
        _finishedDataTransfer = value;
        RaisePropertyChanged("FinishedDataTransfer");
    }
}

以这种方式而不是繁忙指示符执行​​此操作的优点是,在保存运行时,用户仍可以对页面执行操作。

答案 2 :(得分:1)

我们遇到了同样的问题,不得不从发送命令到viewmodel更改为点击按钮后面的代码......

/// <summary>
/// Workaround for handling double-click from the Map Results button - trying to prevent running the query twice and adding duplicate layers into the Layer Control
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MapResultsButton_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (e.ClickCount == 1)
        this.ViewModel.MapResultsCommand.Execute(null);
} 

正如您所看到的,这会使用属ClickCount

MouseButtonEventArgs属性

一旦命令到达viewmodel,我们就可以担心繁忙的指示器和其他禁用按钮的方法。