我有以下代码:
private void StartTask<T>(string parameter)
{
dynamic instance = (T) Activator.CreateInstance(typeof(T), parameter);
Task.Factory.StartNew(() => instance.DoCompare());
}
这不起作用,并且不会调用“DoCompare()”方法...如何使用泛型类型方法中的参数调用类中的方法?
我正在上课:
public class Something {
private string _parameter;
public Something(string parameter) {
_parameter = parameter;
}
public void DoCompare(){
//Do longrunning task
}
}
编辑:由于混淆而删除了约束BaseClass5
EDIT2 :我得到:类型
的第一次机会异常'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'
EDIT3:
这似乎有效,问题似乎是Task.Factory.StartNew:
private void StartTaskAwesomium<T>() where T
{
dynamic instance = (T) Activator.CreateInstance(typeof (T), parameter);
instance.Test();
}
答案 0 :(得分:0)
理论上你的代码应该可行,但它是一个“ fire-and-forget ”模式,这意味着它将在某个时间执行 ,但你无法控制那或者可以检查它是否实际执行或是否有例外 也许把它改成:
private async void StartTask<T>(string parameter) where T : BaseClass5
{
BaseClass5 instance = (T)Activator.CreateInstance(typeof(T), parameter);
await Task.Factory.StartNew(() => instance.DoCompare());
}
由于您的通用约束,您不需要dynamic
,因为您知道T
必须是BaseClass5
或基于它。
或者将任务返回到await
(或task.Wait()
)其他地方:
private Task StartTask<T>(string parameter)
{
T instance = (T)Activator.CreateInstance(typeof(T), parameter);
return Task.Factory.StartNew(() => instance.DoCompare());
}
答案 1 :(得分:0)
解决方案是将类的创建包装在Task本身中,如下所示:
private void StartTask<T>(string connectionId) where T : BaseClass5
{
Task.Factory.StartNew(() =>
{
dynamic instance = (T) Activator.CreateInstance(typeof (T), connectionId);
instance.DoCompare();
});
}
答案 2 :(得分:-1)
private void StartTask<T>(string parameter)
{
dynamic instance = (T) Activator.CreateInstance(typeof(T), parameter);
Task.Factory.StartNew(() => {instance.DoCompare();});
}
这似乎有效。