相关疑难解决方法(0)

.NET Task实例在运行期间是否超出范围?

如果我在方法中使用以下代码块(使用.NET 4和任务并行库):

var task = new Task(() => DoSomethingLongRunning());
task.Start();
Run Code Online (Sandbox Code Playgroud)

并且该方法返回,该任务是否超出范围并被垃圾收集,或者它将运行完成?我没有注意到GCing的任何问题,但是我想确保我没有为GC设置竞争条件.

.net c# garbage-collection task task-parallel-library

42
推荐指数
2
解决办法
8587
查看次数

为什么GC在我引用它时会收集我的对象?

让我们看一下显示问题的以下片段.

class Program
{
    static void Main(string[] args)
    {
        var task = Start();
        Task.Run(() =>
        {
            Thread.Sleep(500);
            Console.WriteLine("Starting GC");
            GC.Collect();
            GC.WaitForPendingFinalizers();
            Console.WriteLine("GC Done");
        });

        task.Wait();

        Console.Read();
    }

    private static async Task Start()
    {
        Console.WriteLine("Start");
        Synchronizer sync = new Synchronizer();
        var task = sync.SynchronizeAsync();
        await task;

        GC.KeepAlive(sync);//Keep alive or any method call doesn't help
        sync.Dispose();//I need it here, But GC eats it :(
    }
}

public class Synchronizer : IDisposable
{
    private TaskCompletionSource<object> tcs;

    public Synchronizer()
    {
        tcs = new TaskCompletionSource<object>(this); …
Run Code Online (Sandbox Code Playgroud)

.net c# garbage-collection async-await

13
推荐指数
2
解决办法
1756
查看次数