【发布时间】:2014-08-03 16:38:24
【问题描述】:
我正在尝试将代码从 Thread 替换为 Task。睡眠/延迟仅代表长时间运行的活动。
static void Main(string[] args)
{
ThreadDoWork();
TaskDoWork();
}
public static void ThreadDoWork()
{
using (var dispose = new ThreadDispose())
{
dispose.RunAsync();
}
}
public static async void TaskDoWork()
{
using (var dispose = new TaskDispose())
{
await dispose.RunAsync();
}
}
public class ThreadDispose : IDisposable
{
public void RunAsync ()
{
ThreadPool.QueueUserWorkItem(state =>
{
Thread.Sleep(3000);
});
}
void IDisposable.Dispose()
{
File.AppendAllText("D:\\test.txt", "thread disposing");
}
}
public class TaskDispose : IDisposable
{
public async Task RunAsync()
{
await Task.Delay(3000);
}
void IDisposable.Dispose()
{
File.AppendAllText("D:\\test.txt", "task disposing");
}
}
test.txt 3秒后的结果只有
线程处理
为了让TaskDispose::Dispose 始终像ThreadDispose 一样执行,我需要更改什么?
【问题讨论】:
-
你是否意识到你的 ThreadDispose 在它完成工作之前就被处理掉了?我想如果你给它时间来实际完成,这个任务也会被处理掉。
-
是的,我意识到,任务概念对我来说有点新,所以请告诉我如何用任务代码替换线程代码
-
尝试将
public static async void TaskDoWork()更改为public static async Task TaskDoWork()并在Main中等待它... -
@AnthonyChu,同样的结果,主要的
TaskDoWork();是警告Because this code is not awaited..,我试图只是await TaskDoWork();并将Main更改为static async void Main,但它编译错误
标签: c# .net multithreading async-await dispose