Pergunta

Eu tenho o problema que eu estou instanciating um objeto na UI-thread (WinForms). Esta criação do objeto provavelmente leva muito tempo, e eu gostaria de ter algum tipo de "timeout" para esse método (porque ele está bloqueando o meu app).

Os problemas que tenho são: 1. o objeto deve ser criado no thread UI 2. o objeto é um objeto estranho, e eu não tenho qualquer acesso fonte, por isso não pode modificá-lo.

Então me pergunta seria, se alguém tem uma idéia criativa, se é possível criar uma lógica que pára o método para se executado se um tempo limite é atingido?

tia Martin

Foi útil?

Solução

Aqui é uma má solução. Use um segmento de trabalho em um timer para monitorar o segmento. Se os decorrido temporizador antes o objeto é criado, tem o Abort chamada segmento de trabalho no segmento. Isto irá aumentar a ThreadAbortException no segmento interface do usuário que você deve pegar. As razões pelas quais isso é ruim é porque você pode fazer com que seu programa para travar ou falhar dependendo das condições de tempo e de raça sutis para quando a exceção é gerada.

Um método "mais seguro" é ter o Interrupt chamada trabalhador - o que irá levantar uma ThreadInterruptedException no segmento interface do usuário, mas somente quando ele está no estado WaitSleepJoin - se o segmento nunca dorme não vai interromper, mas pelo menos não vai travar ou corromper a memória também.

Outras dicas

Não é verdade; especialmente se você não tiver acesso à fonte.

Mesmo se você pudesse, não é uma boa idéia para código à força de interrupção sem uma boa razão -. Ele só pode levar a problemas (vazamentos, fechaduras sendo deixado trancada, etc)

Tem que ser o mesma segmento interface do usuário? Você poderia gerar um segundo segmento interface do usuário possuir esse código? Fica um pouco desconexo, mas pode funcionar.

Se você estiver usando BeginInvoke, o IAsyncResult tem um identificador de espera onde pode WaitOne (timeout) -. da rosca não-UI

Infelizmente, no tempo limite, não há nenhuma maneira limpa para cancelar que BeginInvoke -. Assim você pode tentar a solução da 1800 INFORMATION

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top