Usando async-waitit no .net 4

137

Atualmente, estou começando a criar um aplicativo que beneficiaria muito com o recurso de espera assíncrona do C # 5. Mas não tenho certeza de qual versão do VS e do tempo de execução assíncrono usar.

Analisando os gráficos de popularidade do sistema operacional, precisarei dar suporte ao Windows XP por mais três anos. Parece que o .net 4.5 é executado apenas nas versões mais recentes do Windows, então eu preciso direcionar o .net 4.0. As máquinas de desenvolvimento usam o Windows 7, portanto, usar uma versão mais recente do VS não é um problema.

Agora, primeiro preciso escolher um compilador para fazer isso:

  • VS2010 com AsyncCTP
  • Visualização do VS2012 (e final quando chegar), definindo o destino como .net 4.0
  • Mono (parece que a versão 2.12 tem async-waitit, eu prefiro / estou acostumado a VS do que o MonoDevelop como IDE)

Qual deles possui menos bugs de geração de código? Olhando para o blog de Jon Skeet, o VS2012 Preview usa um gerador de código que nunca o CTP.

E, mais importante, qual tempo de execução usar?

O VS2012 contém um tempo de execução assíncrono redistribuível para uso com o .net 4?

Consegui compilar o código, com a visualização, fazendo referência ao tempo de execução do AsyncCTP. Mas como o CTP tem condições estranhas de licenciamento, isso não parece uma boa solução a longo prazo.

Ou devo usar uma implementação de terceiros? Talvez mono tem um?

Para distribuir a biblioteca, prefiro simplesmente colocar a dll no mesmo diretório que o aplicativo, em vez de algum tipo de instalador.

Eu também gostaria que meus binários funcionassem sem alterações no mono + Linux / MacOS. Portanto, o tempo de execução deve ser compatível com qualquer mono (2.12 provavelmente) incorporado ou permitir o uso em sistemas operacionais que não são do Windows.

CodesInChaos
fonte
1
Não acho que você vá longe com uma versão CTP, pois não será permitido redistribuir nada que faça parte de um CTP com um aplicativo comercial. Certamente existem erros à espreita e ainda não estão otimizados para o desempenho. Talvez você o desenvolva mais rapidamente, mas seus clientes não ficarão felizes em instalar um software beta que possa interferir nas versões finalmente lançadas.
Alois Kraus
@Alois As versões posteriores do AsyncCTP permitem redistribuição. E a pior coisa que pode acontecer é a interrupção do meu aplicativo. Não é como se isso pudesse interferir em outros aplicativos, então não vejo como você entende o seu show sobre a interferência na versão final. Também parte da minha pergunta é se alguma vez haverá uma versão final compatível com o WinXP.
CodesInChaos
1
A licença declara claramente (Async CTP 3) "1.a.ii. você concorda em interromper esse uso imediatamente após aviso da Microsoft;". Suspeito que esse aviso venha do MS quando for lançado. Não sou advogado, mas tenho certeza de que seu departamento jurídico (se você tiver um) adoraria ouvir sua lógica de como deseja contornar isso sem violar os termos da licença.
Alois Kraus

Respostas:

106

A Microsoft lançou o Async Targeting Pack (Microsoft.Bcl.Async) através do Nuget como um substituto para o AsyncCTP.

Você pode ler mais sobre isso aqui: http://blogs.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl-async-is-now-stable.aspx .

Você pode ler sobre a versão anterior aqui: http://blogs.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx .

Como esse pacote é oficialmente suportado, agora acredito que a melhor opção para direcionar o XP + assíncrono seria usar o Visual Studio 2012 + C # 5 + Pacote de direcionamento assíncrono.

No entanto, se você sentir a necessidade de direcionar o .NET 3.5, ainda poderá usar (meu) AsyncBridge for .NET 3.5 .

Omer Mor
fonte
Não consigo encontrar nenhuma referência a uma licença para o seu AsyncBridge?
toong
15
Lembre-se de que o uso do pacote de direcionamento assíncrono no .NET 4.0 requer a instalação do KB2468871.
Ghord
O KB2468871 foi lançado em junho de 2011 (e 6 meses depois foi lançada a v2), mas ainda não está instalado, portanto, veja como verificá-lo no WiX - stackoverflow.com/a/9506530/968003 .
Alex Klaus
24

Se você está aberto a considerar outras linguagens .Net, o F # pode resolver seu problema. Ele possui a expressão de computação assíncrona {} há anos e é compatível com versões anteriores, mesmo com o .Net 2.0. O requisito mínimo é o Windows XP SP3. O tempo de execução pode ser baixado aqui .

Marc Sigrist
fonte
4

É possível usar o VS 12 beta para direcionar o .NET 4.0 usando async / waitit.

Você precisa copiar algum código no seu projeto que forneça os tipos nos quais o compilador depende.

Detalhes aqui

Edit: pegamos essa técnica e a transformamos em uma biblioteca de código aberto chamada AsyncBridge: https://nuget.org/packages/AsyncBridge

Alex Davies
fonte
3

Se você deseja distribuir seu software, acho que a solução Mono é realmente sua única opção no momento. Você também diz que deseja que o resultado final seja executado no Mono no Linux e no OS X. A segmentação do Mono para começar parece ser a solução natural.

Sua próxima edição é o IDE. O MonoDevelop obviamente funcionaria bem, mas você diz que prefere o Visual Studio.

Greg Hurlman criou um perfil para codificar no Mono 2.8 a partir do Visual Studio. Se você o acompanhar, ele poderá apontá-lo na direção certa para o desenvolvimento contra o Mono 2.11 / 2.12 no Visual Studio.

Obviamente, também há o Mono Tools for Visual Studio, que é um produto comercial. Presumo que ainda esteja sendo oferecido pela Xamarin .

Você também pode executar os assemblies de perfil 4.5 exigidos do Mono sobre o .NET, mas eu não tentei isso. O perfil 4.5 é um superconjunto estrito da API 4.0. Talvez dê uma chance e relate de volta.

EDIT: Parece que talvez você possa usar o CTP do Visual Studio Async em produção agora

Aqui está o que diz na página de download :

Inclui um novo EULA para uso em produção. Nota - Esta licença não constitui incentivo para você usar o CTP para o seu código de produção. O CTP continua sendo uma visualização de tecnologia não suportada e com o risco de uso. No entanto, recebemos muitas solicitações de desenvolvedores para usar o CTP para código de produção e, portanto, alteramos a licença para permitir isso.

Justin
fonte
O que eu uso no desenvolvimento é a questão menor. A principal questão é o que devo entregar aos meus usuários do WinXP. Você sugere o pacote mono 2.12 com meu aplicativo?
CodesInChaos
Ontem, olhei para as fontes mono e pelo menos várias das principais classes assíncronas ( Async...Buildere ...Awaiter) são muito difíceis de separar do resto das mono. Atualmente, estou pensando em reimplementar AsyncCtpLibrary, possivelmente emprestando um pouco do mono.
CodesInChaos
Ao redistribuir AsyncCtpLibrary, sei que é possível em princípio, mas, por um lado, a licença contém algumas cláusulas estranhas. Mas a minha questão principal aqui é o que acontece a longo prazo. Se não for suportado e ninguém corrigir bugs, isso pode ser irritante.
CodesInChaos
2

Se você deseja começar a distribuir seu software após o MS lançar o C # 5.0, poderá começar a desenvolver usando o AsycnCTP. Caso contrário, eu não recomendaria que você o usasse, pois é apenas CTP, nem mesmo um beta. Pode ser alterado muito perto do estágio beta e do lançamento. Pode ser instável, etc.

Se você deseja introduzir operações assíncronas fáceis no seu aplicativo, recomendo que você use Extensões Reativas e outras coisas construídas na parte superior (Interface do Usuário Reativa, etc), isso é simplesmente maravilhoso.

Quanto ao VS2012, ele também contém o mesmo CTP assíncrono, tanto quanto me lembro do meu // Build / tablet que a MS me deu nessa conferência.

Alexey Raga
fonte
1
Eu não me importo em esperar pelo lançamento do VS2012. Espero que o VS2012 seja lançado antes que meu software esteja fora de alfa. Mas, mesmo após o lançamento do VS2012, não quero segmentar o .net 4.5, pois isso não parece estar disponível no WinXP. Assim, a questão principal é que tempo de execução assíncrona para usar em .net 4.
CodesInChaos