2017-01-15 5 views
0

にこんにちは、私がお聞きしたいすべての人は、引数を持つすべての方法[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

別のやり方であなたに適しているかどうかを確認してください。

戻ってくるオブジェクトのタイプを示すインジケータとともに、戻り値を含むクラスを作成します。

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を使用する必要があります。 パラメータを取らなければならない場合は、オブジェクト配列オブジェクト[]のように、パラメータを取る必要があります。

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(); 
} 
+0

ありがとう、私はそれを試してみましょう...しかし、これ以上簡単ですか? –

1

あなたのコードは多くの理由で機能していません。

  1. Actionが、それは行動だ、何も返すことができない、あなたはFunc
  2. を使用する必要がありますあなたはそれを割り当て、アクションを呼び出すことはありませんので、あなたは、このコードを記述する必要があります。file = action();
  3. ます」 () => queeImageFromString(str)
  4. 大きな問題はありませんが、文字列を作成するために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の使用法を考えるべきです。