相关疑难解决方法(0)

在.net 4上使用async-await

我现在开始创建一个可以从C#5的async-await功能中获益的应用程序.但我不确定使用哪个版本的VS和async运行时.

看看操作系统受欢迎程度图表,我需要再支持Windows XP三年左右.看起来.net 4.5仅在较新版本的Windows上运行,因此我需要以.net 4.0为目标.开发机器使用Windows 7,因此使用较新版本的VS不是问题.

现在我需要先选择一个编译器来执行此操作:

  • 带有AsyncCTP的VS2010
  • VS2012预览(最后一次到达),将目标设置为.net 4.0
  • Mono(看起来像2.12有async-await,我更喜欢/习惯使用VS而不是MonoDevelop作为IDE)

哪一个代码生成错误较少?看看Jon Skeet的博客,VS2012 Preview使用的是永不代码生成器而不是CTP.

更重要的是使用哪个运行时?

VS2012是否包含可再发行的异步运行时与.net 4一起使用?

通过引用AsyncCTP运行时,我设法通过预览编译代码.但由于CTP具有奇怪的许可条件,这看起来不是一个好的长期解决方案.

或者我应该使用第三方实施?也许单声道有一个?

为了分发库,我更喜欢将dll放在与应用程序相同的目录中,而不是某种安装程序.

如果我的二进制文件在单声道+ Linux/MacOS上没有变化的情况下工作,我也会喜欢它.因此运行时应该与内置的任何单声道(可能是2.12)兼容,或者允许在非Windows操作系统上使用.

c# .net-4.0 async-await c#-5.0 async-ctp

137
推荐指数
2
解决办法
6万
查看次数

await Task vs await Task.Run(voidMethod)

我很困惑为什么这两个程序的输出有所不同:

private async void button1_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 33; i++)
    {
        await LongProcess();
    }
}

private async Task LongProcess()
{
    await Task.Delay(1000);
    progressBar1.Value += 3;
}
Run Code Online (Sandbox Code Playgroud)

private async void button1_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 33; i++)
    {
        await Task.Run(() => LongProcess());
    }
}

private async void LongProcess()
{
    await Task.Delay(1000);
    progressBar1.Value += 3;
}
Run Code Online (Sandbox Code Playgroud)

我意识到返回的第一个例子Task更正确,但我不明白为什么在a Task.Run中包装void函数不会产生相同的输出?第一个功能完成我的预期,每1秒更新一次进度条.第二个代码尝试一次更新进度条,导致尝试从多个线程更新相同的UI元素时出现问题.

我的假设是,因为buttonClick方法等待漫长的过程完成,所以两组代码都不允许progressBar1更新发生,直到前一个过程完成.为什么第二组代码允许它同时发生?

c# asynchronous async-await

1
推荐指数
1
解决办法
848
查看次数

标签 统计

async-await ×2

c# ×2

.net-4.0 ×1

async-ctp ×1

asynchronous ×1

c#-5.0 ×1