通用线程方法

时间:2017-01-15 07:48:37

标签: c# multithreading

大家好我想问一下,是否有任何方法使用可以运行每个方法[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;
}

谢谢。

2 个答案:

答案 0 :(得分:1)

您的代码无法正常工作。

  1. Action无法返回任何内容,这是一个操作,您必须使用Func
  2. 您不会调用该操作,只需分配它,因此您必须编写此代码:file = action();
  3. 你正在以错误的方式从lambda创建动作,你需要这样做:() => queeImageFromString(str)
  4. 不是主要问题,但您不必创建StringBuilder来创建字符串,您可以返回方法结果本身。
  5. 你需要的是一个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();
}