A coleta do Silverlight é segura para threads?
-
26-09-2019 - |
Pergunta
Estou tentando descobrir isso, dado o seguinte código, o refresh () precisa ocorrer no thread da interface do usuário? Parece funcionar, e estou me perguntando se o CollectionViewSource é na verdade um objeto com reconhecimento de linha / seguro? Definitivamente, possui propriedades e métodos para apoiar a chamada no encadeamento correto, mas não tenho certeza se isso é deixado para o desenvolvedor ou se isso é realizado dentro do objeto?
public CollectionViewSource UserList { get; private set; }
void setupCollections()
{
UserList = new CollectionViewSource();
UserList.Source = searchProvider.UserResults;
UserList.SortDescriptions.Add(new SortDescription("DisplayName", ListSortDirection.Ascending));
}
Este tópico é seguro em Silverlight ???
void RefreshUserList()
{
UserList.View.Refresh();
}
Ou você precisa fazer algo assim?
void RefreshUserList()
{
// Is This Required?
UserList.Dispatcher.BeginInvoke(() =>
{
UserList.View.Refresh();
});
// Or MVVM-light Method
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
UserList.View.Refresh();
});
}
Solução
De acordo com a documentação da Microsoft sobre ColeçãoViewSource O objeto CollectionViewSource não é seguro. Parece que isso não é relatado como seguro, mesmo que pareça funcionar em muitas situações.
Isso pode ocorrer porque o método chamado está realmente na visualização, não na Coleção ViewSource. A vista retorna um ICOLLECTIONVIEW Interface - Os detalhes da classe de suporte não são conhecidos, exceto que o método Createview () cria isso.
Eu sugeriria que sempre consideramos isso não segura e a despachar para o encadeamento correto, embora meu teste da visualização.Refresh () pelo menos sugira que ele seja seguro para threads.