为什么我的方法不是异步的
本文关键字:异步 我的 方法 为什么 | 更新日期: 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());
}
我不认为在构造函数中发生长时间运行的过程是一个好主意。