为什么我的方法不是异步的

本文关键字:异步 我的 方法 为什么 | 更新日期: 2023-09-27 18:02:21

当我有以下代码时,它执行async:

Task.Factory.StartNew(() => new Class(string, string2, string3));

当我像这样创建一个泛型方法时,async不再工作了:

private void StartTask<T>(string, string2, string3) where T : BaseClass10
{
    var instance = (T) Activator.CreateInstance(typeof (T), string, string2, string3);
    Task.Factory.StartNew(() => instance);
}

我这样执行:

StartNew<SomeClass>(string1, string2, string);
StartNew<SomeClass2>(string1, string2, string);

第二个StartNew在第一个结束后执行…原因是什么呢?

编辑:SomeClass代码:

public class SomeClass {
public SomeClass(string1, string2, string3){
// Long running process that takes time to complete. For example Thread.Sleep or what ever.
 }  
}

为什么我的方法不是异步的

我明白你的意思。第一个版本调用Task中的构造函数(可能是线程池线程)。所以它会在完成之前立即返回。在第二个方法中,您调用Activator.CreateInstance,这实际上是创建实例并执行构造函数。

你可以看到Activator.CreateInstance是从调用线程本身而不是在任务内部调用的,它是同步执行的。

要使泛型方法如您所期望的那样,您需要将其包装在Task中,如下所示:

private void StartTask<T>(string, string2, string3) where T : BaseClass10
{
    Task.Factory.StartNew(() => (T) Activator.CreateInstance(typeof (T), string, string2, string3));
}

您原来的StartTask方法:

private void StartTask<T>(string, string2, string3) where T : BaseClass10
{
    var instance = (T) Activator.CreateInstance(typeof (T), string, string2, string3);
    Task.Factory.StartNew(() => instance);
}

如果长时间运行的进程发生在T的构造函数中,那么请注意长时间运行的进程发生在Task.Factory.StartNew()之外。

将长时间运行的进程移动到T上的方法中(例如LongRunningProcess()),然后您可以这样做:

private void StartTask<T>(string, string2, string3) where T : BaseClass10
{
    var instance = (T) Activator.CreateInstance(typeof (T), string, string2, string3);
    Task.Factory.StartNew(() => instance.LongRunningProcess());
}

我不认为在构造函数中发生长时间运行的过程是一个好主意。