tempo limite para o método no segmento interface do usuário
-
03-07-2019 - |
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
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