如何防止silverlight中的UI线程锁定
在视图中,我有一个按钮,用于调用视图模型中的方法 search.xaml如何防止silverlight中的UI线程锁定,silverlight,mvvm,ui-thread,Silverlight,Mvvm,Ui Thread,在视图中,我有一个按钮,用于调用视图模型中的方法 search.xaml <TextBox x:Name="txtSearchField" Grid.Column="0" Style="{StaticResource SearchTxtBoxStyle}" Text="{Binding SearchTerm, Mode=TwoWay}" KeyDown="txtSearchField_
<TextBox x:Name="txtSearchField"
Grid.Column="0"
Style="{StaticResource SearchTxtBoxStyle}"
Text="{Binding SearchTerm, Mode=TwoWay}"
KeyDown="txtSearchField_KeyDown"
ToolTipService.ToolTip="{StaticResource TTsearchField}">
<i:Interaction.Triggers>
<ei:KeyTrigger Key="Enter">
<ei:CallMethodAction
TargetObject="{Binding}"
MethodName="GetSearchResult"/>
</ei:KeyTrigger>
</i:Interaction.Triggers>
</TextBox>
<StackPanel x:Name="searchButtons"
Grid.Row="0"
Grid.Column="1"
Margin="3,2,5,2"
Orientation="Horizontal">
<Button x:Name="SearchButton"
Margin="13,1,9,-1"
ap:AttachedProperties.TabIndex="2"
Content="{StaticResource btnSearch}"
Style="{StaticResource blackButton}"
ToolTipService.ToolTip="{StaticResource TTSavebtn}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction
TargetObject="{Binding}"
MethodName="GetSearchResult"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
然后在模型中,我对WCF服务进行了异步调用
public ObservableCollection<QueryResponse> GetSearchResults(string searchQuery)
{
SearchClient sc = new SearchClient();
sc.QueryCompleted +=new EventHandler<QueryCompletedEventArgs>(sc_QueryCompleted);
sc.QueryAsync(new Query { QueryText = searchQuery });
return this.SearchResults;
}
void sc_QueryCompleted(object sender, QueryCompletedEventArgs e)
{
try
{
if (SearchResults != null)
{
this.SearchResults.Clear();
this.SearchResults.Add(e.Result);
}
else
{
this.SearchResults.Add(e.Result);
}
// IsBusy = false;
}
catch(Exception ex)
{
ex.StackTrace.ToString();
}
}
公共ObservableCollection GetSearchResults(字符串搜索查询)
{
SearchClient sc=新的SearchClient();
sc.QueryCompleted+=新事件处理程序(sc_QueryCompleted);
sc.QueryAsync(新查询{QueryText=searchQuery});
返回此.SearchResults;
}
void sc_QueryCompleted(对象发送方,QueryCompletedEventArgs e)
{
尝试
{
if(SearchResults!=null)
{
这是.SearchResults.Clear();
this.SearchResults.Add(e.Result);
}
其他的
{
this.SearchResults.Add(e.Result);
}
//IsBusy=false;
}
捕获(例外情况除外)
{
例如StackTrace.ToString();
}
}
搜索控件通过应用了dataTempalte选择器类的listbox控件加载结果
我看到的问题是,由于此调用是从UI调用的,UI线程将锁定,直到为集合选择datatemplates并返回结果。至此,IsBusy指示灯甚至没有亮起
我的问题是,有人能告诉我如何进行这些调用,以使UI线程不被锁定吗?我是否应该寻找某种后台线程等来进行调用,以便UI线程可以调用IsBusy指示符等
请让我知道,如果你需要更多的细节或额外的样品
提前感谢这里的问题是你锁定了UI线程,而从表面上看,考虑到事情的结构,如果没有模型中SearchResult中的代码,一切都应该正常工作,我无法确定你的问题可能在哪里 此外,在*sc_QueryCompleted*中存在空引用问题,检查SearchResults是否不等于空,但在else条件下,尝试向刚刚验证的对象添加值将为空。更正版本如下:
if (SearchResults != null) {
this.SearchResults.Clear();
this.SearchResults.Add(e.Result);
} else {
//I'm guessing at the type from your code
this.SearchResults = new List<SearchResult)();
this.SearchResults.Add(e.Result);
}
if(SearchResults!=null){
这是.SearchResults.Clear();
this.SearchResults.Add(e.Result);
}否则{
//我从你的代码中猜到了类型
this.SearchResults=新列表
public ObservableCollection<QueryResponse> GetSearchResults(string searchQuery)
{
SearchClient sc = new SearchClient();
sc.QueryCompleted +=new EventHandler<QueryCompletedEventArgs>(sc_QueryCompleted);
sc.QueryAsync(new Query { QueryText = searchQuery });
return this.SearchResults;
}
void sc_QueryCompleted(object sender, QueryCompletedEventArgs e)
{
try
{
if (SearchResults != null)
{
this.SearchResults.Clear();
this.SearchResults.Add(e.Result);
}
else
{
this.SearchResults.Add(e.Result);
}
// IsBusy = false;
}
catch(Exception ex)
{
ex.StackTrace.ToString();
}
}
if (SearchResults != null) {
this.SearchResults.Clear();
this.SearchResults.Add(e.Result);
} else {
//I'm guessing at the type from your code
this.SearchResults = new List<SearchResult)();
this.SearchResults.Add(e.Result);
}