相关疑难解决方法(0)

使用Application.DoEvents()

可以Application.DoEvents()在C#中使用吗?

这个函数是否能够让GUI跟上应用程序的其余部分,就像VB6 DoEvents一样?

c# doevents winforms

263
推荐指数
6
解决办法
17万
查看次数

await vs Task.Wait - 死锁?

我不太明白之间的差别Task.Waitawait.

我在ASP.NET WebAPI服务中有类似于以下函数:

public class TestController : ApiController
{
    public static async Task<string> Foo()
    {
        await Task.Delay(1).ConfigureAwait(false);
        return "";
    }

    public async static Task<string> Bar()
    {
        return await Foo();
    }

    public async static Task<string> Ros()
    {
        return await Bar();
    }

    // GET api/test
    public IEnumerable<string> Get()
    {
        Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray());

        return new string[] { "value1", "value2" }; // This will never execute
    }
}
Run Code Online (Sandbox Code Playgroud)

哪里Get会僵局.

什么可能导致这个?当我使用阻塞等待而不是await Task.Delay?时,为什么这不会导致问题?

c# deadlock task-parallel-library async-await

169
推荐指数
3
解决办法
13万
查看次数

BackgroundWorker的任务并行库替换?

任务并行库是否有任何可以被认为是对BackgroundWorker类的替换或改进?

我有一个带有向导式UI的WinForms应用程序,它执行一些长时间运行的任务.我希望能够使用标准进度条和取消操作的响应式UI.我之前用BackgroundWorker做过这个,但是我想知道是否有一些可以使用的TPL模式?

c# backgroundworker winforms task-parallel-library

82
推荐指数
2
解决办法
4万
查看次数

C#5.0的异步等待功能与TPL有何不同?

我没有看到C#(和VB)的新异步功能和.NET 4.0的任务并行库之间存在差异.举个例子来说,埃里克利珀的代码从这里:

async void ArchiveDocuments(List<Url> urls) {
    Task archive = null;
    for(int i = 0; i < urls.Count; ++i) {
        var document = await FetchAsync(urls[i]);
        if (archive != null)
            await archive;
        archive = ArchiveAsync(document);
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎该await关键字有两个不同的用途.第一个出现(FetchAsync)似乎意味着,"如果稍后在方法中使用此值并且其任务未完成,请等到它完成后再继续." 第二个实例(archive)似乎意味着,"如果此任务尚未完成,请立即等待直到完成." 如果我错了,请纠正我.

难道不能像这样容易写吗?

void ArchiveDocuments(List<Url> urls) {
    for(int i = 0; i < urls.Count; ++i) {
        var document = FetchAsync(urls[i]);       // removed await
        if (archive != null) …
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library async-await c#-5.0

61
推荐指数
4
解决办法
1万
查看次数

如何从WPF gui运行异步任务并与之交互

我有一个WPF GUI,我想按下一个按钮来启动一个长任务,而不会在任务期间冻结窗口.当任务正在运行时,我想获得有关进度的报告,我想在我选择的任何时候添加另一个按钮来停止任务.

我无法想出使用async/await/task的正确方法.我不能包括我尝试的所有东西,但这就是我现在拥有的东西.

一个WPF窗口类:

public partial class MainWindow : Window
{
    readonly otherClass _burnBabyBurn = new OtherClass();
    internal bool StopWorking = false;

    //A button method to start the long running method
    private async void Button_Click_3(object sender, RoutedEventArgs e)
    {   
        Task burnTheBaby = _burnBabyBurn.ExecuteLongProcedureAsync(this, intParam1, intParam2, intParam3);

        await burnTheBaby;
    }

    //A button Method to interrupt and stop the long running method
    private void StopButton_Click(object sender, RoutedEventArgs e)
    {
        StopWorking = true;
    }

    //A method to allow the worker method to call …
Run Code Online (Sandbox Code Playgroud)

c# wpf asynchronous

44
推荐指数
4
解决办法
5万
查看次数

是不是.NET 4.0 TPL使APM,EAP和BackgroundWorker异步模式过时了?

我有2种C#WPF应用程序项目:

  • 基于.NET 4.0,我无法迁移到.NET 4.5
  • 基于.NET 4.0,我可以迁移到.NET 4.5

所有这些都应该产生2-10个长时间运行(天)的过程,这些过程可以被用户取消和重新启动.

我有兴趣遵循最佳设计实践.首先,现在,我有兴趣消除BackgroundWorker使用的歧义,但我希望,我的问题应该对其他异步模式有效.

我看到(矛盾)并发的观点

异步模式:

"基于异步的异步编程方法几乎在所有情况下都优于现有方法.特别是,对于IO绑定操作,这种方法优于BackgroundWorker,因为代码更简单,您不必防范竞争条件.与Task.Run结合使用,异步编程优于 BackgroundWorker用于CPU绑定操作,因为异步编程将运行代码的协调细节与Task.Run传输到线程池的工作分开"

我仍有疑问:

  1. 这些模式(首先,BGW)在.NET 4.5中是否已过时?
  2. 如果它们在.NET 4.5中已经过时,为什么它们在.NET 4.0中不会过时?

    2A)我是否错误地理解.NET 4.0新功能在.NET 4.0中仍然"易于"实现/重现?

c# wpf backgroundworker task-parallel-library async-await

19
推荐指数
2
解决办法
3980
查看次数

是否等待使方法的其余部分异步?

我已经读过'BackgroundWorker'被Ansyc/Await 取代了.

因为我喜欢Async/Await的浓缩外观,所以我开始将一些BackgroundWorkers转换为Async/Await调用.

这是我的代码示例(从UI调用):

public async void RunFromTheUI()
{
   await OtherAction();
}

public async void OtherAction()
{
   var results = await services.SomeRemoteAction();

   foreach (var result in results)
   {
      result.SemiIntenseCalculation(); 
      Several();
      Other();
      NonAsync();
      Calls();  
   }

   SomeFileIO();
}
Run Code Online (Sandbox Code Playgroud)

当我调用RunFromTheUI它时几乎会立即返回(根据Async和Await设计).

但是当它在services.SomeRemoteAction()完成后恢复时它有一个foreach循环和另一个方法调用来运行.

我的问题是:如果那个循环是一个性能猪,它会冻结UI吗? (在我将它全部放在后台工作线程之前,所以它没有减慢用户界面的速度).

注意:我的目标是.Net 4.0并使用Async Nuget Package.

.net c# async-await

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

如何使用 Task.Run() 更改 label.text

没有工作await Task.Run()

private async void button2_Click(object sender, EventArgs e)
{
    await Task.Run(() => {
        monitor_r(label1);
    });
}

protected async Task monitor_r(Label L1)
{
    MessageBox.Show(L1.Name);
    L1.ForeColor = Color.Blue;
    L1.Text = "test";
}
Run Code Online (Sandbox Code Playgroud)

这些命令

MessageBox.Show(L1.Name); 
Run Code Online (Sandbox Code Playgroud)

L1.ForeColor = Color.Blue;  
Run Code Online (Sandbox Code Playgroud)

工作正常但是

L1.Text = "test"; 
Run Code Online (Sandbox Code Playgroud)

不起作用

你能帮忙吗,为什么不改变一个Label Text

c# multithreading winforms

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