São expressões lambda multi-threaded?
-
19-08-2019 - |
Pergunta
São expressões lambda multi-threaded?
Say quando você escreve uma fórmula matemática como um método lambda, quando você passá-lo para outro método, seria multi-threaded?
Solução
Não 100% claro sobre o que você está pedindo.
Você está perguntando se lambdas são naturalmente ser executado em um segmento diferente?
Se assim não, eles são apenas mais uma instância de System.Delegate e executado no thread principal a menos que especificamente solicitado a fazer o contrário.
Você está perguntando se eles são seguros para ser executado em vários segmentos?
Esta é uma questão que só pode ser respondida por saber o conteúdo da expressão lambda. Eles não são inerentemente thread-safe. Na minha experiência, o são muito menos propensos a ser thread-safe do que você esperaria.
Outras dicas
Não, eles são executados no thread eles são criados a menos que você passá-lo para outro segmento, assim como qualquer outro método. Você não gostaria que eles sejam executados em um segmento diferente automaticamente, confie em mim.
Na próxima versão do C #, eles estão adicionando opções de multi-threading para LINQ (chamado PLINQ) e delegados. Confira mais informações aqui . Atualmente, é tudo em um único segmento.
Como já foi dito, as expressões lambda não são inerentemente multi-threaded, nem o padrão LINQ para objetos métodos de extensão fazer nada especial para chamá-los em segmentos separados.
No entanto, se você quiser fazer alguma LINQ como a programação multi-thread, você deve verificar se o Extensões paralelo ao .NET Framework . Também confira este link:
http://blogs.msdn.com/pfxteam/
Infelizmente, este não será RTM até VS2010 / .Net4.0 está fora.
Bem, um lambda é apenas um método anônimo, ele é executado em qualquer segmento em que é chamado a menos que você fornecer o código para executar em um segmento separado.
As expressões lambda são métodos apenas como quaisquer outros. O que torna um método de vários segmentos?
- Sem acesso a campos externos (método simples de entrada / saída) - tal método um é sempre multithreaded
- O acesso a um campo sincronizado -. Consideram cenário de sincronização (classe
Monitor
, leitor / bloqueio de escritor, acessoInterlocked
,WaitHandle
, etc.), para minimizar as alegações de bloqueio - Acessando uma variável capturada (fechamento) - Certifique-se de que a variável capturada não muda enquanto outros tópicos usá-lo (como a variável é acessado: apenas lê, lê e escreve ...)
O compilador C # é inteligente o suficiente para saber se métodos estáticos ou de instância são gerados para seus lambdas.
potencialmente confuso (mas é verdade) resposta. Em alguns cenários comumente encontradas, a lambda pode executar em outra máquina, em um tipo completamente diferente de ambiente de execução e, portanto, em outro segmento, ea necessidade chamador não necessariamente esperar a execução remota de completa completa antes de continuar.
(Especificamente, se você passá-lo para uma consulta LINQ to SQL.)