使用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);
答案 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,我们就可以担心繁忙的指示器和其他禁用按钮的方法。