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?

Foi útil?

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, acesso Interlocked, 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.)

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