大家好我想问一下,是否有任何方法使用可以运行每个方法[B]的线程并返回任何类型的方法[B]参考:
private static Image queeImageFromString (string str)
{
// bla bla
return myImage;
} ///methods B return image
private static byte[] queeImagetoBtye (string str, string b)
{
//bla bla
return myBytesArray;
} //methods B return image
//**this is the methode I want to ask**
private static dynamic RunMethods(Action action)
{
var file;
var thread = new Thread(() => { file = action; });
thread.Start();
thread.Join();
return file; //will return anything like string, image, bytearray depending on method[B] returne
/// note : this code still wrong
}
/// I want to do 'RunMethods' run like this
public static string getResultByte (string str, string b)
{
// if methods[B] return string it will return string
StringBuilder strb = new StringBuilder (RunMethods(queeImagetoBtye (str,b));
return strb.ToString();
}
public static Image getImageResult (string str)
{
//if methods[B] return Image it will return Image
Image imgs = RunMethods( queeImageFromString (str));
return imgs;
}
谢谢。
答案 0 :(得分:1)
您的代码无法正常工作。
Action
无法返回任何内容,这是一个操作,您必须使用Func
file = action();
() => queeImageFromString(str)
StringBuilder
来创建字符串,您可以返回方法结果本身。你需要的是一个generic
方法,因为动态结构很慢,处理它总是与反射有关,默认情况下这很慢。您可以提供要返回的函数类型,如下所示:
private static T RunMethods<T>(Func<T> f)
{
var file;
var thread = new Thread(() => { file = f(); });
thread.Start();
thread.Join();
return file; //will return anything like string, image, bytearray depending on method[B] return value
}
所以电话会是这样的:
//if methods[B] return Image it will return Image
Image imgs = RunMethods<Image>(() => return queeImageFromString(str));
也许电话会更简化,但现在我无法检查。你也应该考虑使用TPL而不是线程。
答案 1 :(得分:0)
检查是否采用其他方式适合您。
我会创建一个包含返回值的类,以及一些指示我正在返回的对象类型的指示符。
public class ReturnValues
{
public object ReturnValue;
public ReturnValueType RetType;
}
enum ReturnValueType
{
typeOfString,
typeOfImage,
typeofInt
}
public static ReturnValues queeString (object[] args)
{
//.....
return new ReturnValues{ ReturnValue="Test", RetType=ReturnValueType.typeOfString };
}
现在,您必须使用Func而不是Action。 如果必须获取参数,则必须将它们放在某个对象中,如对象数组对象[]。
public static ReturnValues RunMethods(Func<object[],ReturnValues> action)
{
var file=action;
//.....
return file;
}
public static string getResultByte (object[] args)
{
string str=(string)args[0];
string b=(string)args[1];
var initValue=RunMethods(queeString(args));
string returnedString;
if (initValue.RetType==ReturnValueType.typeOfString)
{
returnedString=(string)initValue.ReturnValue;
}
StringBuilder strb = new StringBuilder (returnedString);
return strb.ToString();
}