如何使用Thread.Sleep与Task.Run而不阻止主踏板

tha*_*alm 4 .net c# multithreading asynchronous

是否可以确保任务在主线程之外的另一个线程上运行?所以这段代码不会打扰调用线程?

var task = Task.Run(() =>
{
    //third party code i don't have access to
    Thread.Sleep(3000);
});
Run Code Online (Sandbox Code Playgroud)

我知道有,Task.Delay但我想确保该任务将在另一个线程上运行.

Nic*_*iff 11

我认为有不同的方法可以实现你的目标.但是根据你想要做的事情,我认为你可以使用async/await,这不会阻止你的UI肯定,并允许你异步控制你的任务.

正如MSDN所说:

异步方法旨在实现非阻塞操作.异步方法中的await表达式在等待的任务运行时不会阻止当前线程.相反,表达式将方法的其余部分作为延续进行注册,并将控制权返回给异步方法的调用者.async和await关键字不会导致创建其他线程.异步方法不需要多线程,因为异步方法不能在自己的线程上运行.该方法在当前同步上下文上运行,并仅在方法处于活动状态时在线程上使用时间.您可以使用Task.Run将CPU绑定的工作移动到后台线程,但后台线程无助于正在等待结果可用的进程.

https://msdn.microsoft.com/en-us/library/mt674882.aspx

这是一个用法示例:

public async Task MyMethodAsync()
{
    Task<int> runTask = RunOperationAsync();

    int result = await longRunningTask;

    Console.WriteLine(result);
}

public async Task<int> RunOperationAsync()
{
    await Task.Delay(1000); //1 seconds delay
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

这不会阻止您的UI


Ste*_*ary 2

@Nico 是正确的,理想情况下,您可以一直使用异步编程。这种方法是理想的,因为它不会浪费线程休眠(或者,在更实际的示例中,阻塞 I/O)。

是否可以确保任务在主线程之外的另一个线程上运行?

是的。Task.Run总是将工作排队到线程池中,并且主(入口点)线程永远不是线程池线程。