如何防止silverlight中的UI线程锁定

如何防止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_

在视图中,我有一个按钮,用于调用视图模型中的方法

search.xaml

 <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);
}