Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在UI线程上运行的非等待异步方法?_C#_.net_Multithreading_Asynchronous - Fatal编程技术网

C# 在UI线程上运行的非等待异步方法?

C# 在UI线程上运行的非等待异步方法?,c#,.net,multithreading,asynchronous,C#,.net,Multithreading,Asynchronous,我希望有一个方法(我们称之为M1)在循环中执行一些async代码(我们称之为第二个方法M2)。在每次迭代中-用户界面应更新为M2 为了等待M2,M1需要是异步的。但是M1应该在UI线程上运行(以避免争用条件),因此它将在没有wait的情况下被调用 我这样认为,M1对UI的更新将在UI线程上,对吗 (Extra:在这种情况下,似乎可以使用异步void。是否正确?是。(假设您使用的同步上下文返回到UI线程,即WinForm/WPF中的同步上下文) 请注意,这也意味着您不能以这种方式安排CPU密集型

我希望有一个方法(我们称之为M1)在循环中执行一些
async
代码(我们称之为第二个方法M2)。在每次迭代中-用户界面应更新为M2

为了等待M2,M1需要是异步的。但是M1应该在UI线程上运行(以避免争用条件),因此它将在没有
wait
的情况下被调用

我这样认为,M1对UI的更新将在UI线程上,对吗


Extra:在这种情况下,似乎可以使用
异步void
。是否正确?

是。(假设您使用的同步上下文返回到UI线程,即WinForm/WPF中的同步上下文)

请注意,这也意味着您不能以这种方式安排CPU密集型操作,因为它将在UI线程上运行

使用
void async
是WinForms中处理事件的标准方法:

void async click_RunManyAsync(...)
{
   await M1();
}

void async M1()
{
     foreach (...)
     {
        var result = await M2(); 
        uiElement.Text = result; 
     }
}

async Task<string> M2()
{
    // sync portion runs on UI thread
    // don't perform a lot of CPU-intensive work

    // off main thread, same synchronization context - so sync part will be on UI thread. 
    var result = await SomeReallyAsyncMethod(...); 

    // sync portion runs on UI thread
    // don't perform a lot of CPU-intensive work
}
void async单击\u RunManyAsync(…)
{
等待M1();
}
void异步M1()
{
foreach(…)
{
var结果=等待M2();
uiElement.Text=结果;
}
}
异步任务M2()
{
//同步部分在UI线程上运行
//不要执行大量CPU密集型工作
//脱离主线程,相同的同步上下文-所以同步部分将在UI线程上。
var result=wait SomeReallyAsyncMethod(…);
//同步部分在UI线程上运行
//不要执行大量CPU密集型工作
}

是的,看来你是对的。试着去做。试着去做会很棘手,因为在这种情况下,比赛条件通常不太可能。我只是很小心,因为有时可能会有人碰到它们。@ispiro顺便说一句,如果你想尝试
任务。延迟(10)
可能是创建真正异步方法的最简单方法。@AlexeiLevenkov感谢你的时间。我现在正在调查整件事。我真的不明白异步如果不在另一个线程上运行有什么意义。不管怎样,我现在正在仔细阅读。再次感谢,谢谢。但我没有明确使用任何同步上下文,我在UWP-Windows通用应用程序中使用了它。这还可以吗?是的,原则是sameI不理解您的示例-因为M1正在等待-它不会在UI线程上运行。是这样吗?@ispiro
await
不会更改代码运行的线程同步部分-因此
await SomeReallyAsyncMethod
调用将在原始线程上进行。同步上下文决定异步操作结束后继续执行的位置。@isipro,否,
await
将不会创建新线程(使用UI提供的同步上下文),除非您命令使用
await任务手动创建它。运行(…cpu绑定的代码…
)。