Динамический метод инноваций в новом потоке - PullRequest
0 голосов
/ 02 января 2011

Кто-нибудь может мне здесь помочь?Мне нужен этот метод для вызова желаемого пользователем метода в новом потоке на основе выбора пользователя из основной формы.Я думаю, что я близок, но я застрял в том, как передать переменную, которая представляет выбор метода пользователя в начале нового потока.

Ответы [ 3 ]

1 голос
/ 02 января 2011

Как насчет чего-то подобного.

public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
        LoadList();
    }

    private void LoadList()
    {
        lstTest.Items.Clear();
        var t1 = new MethodInfo
                     {
                         MethodName = "Test1", 
                         MethodToRun = this.Test1
                     };
        lstTest.Items.Add(t1);


        var t2 = new MethodInfo
                    {
                        MethodName = "Test2",
                        MethodToRun = this.Test2
                    };
        lstTest.Items.Add(t2);
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        var t = lstTest.SelectedItem as MethodInfo;
        if (t != null)
        {
            var a = new Task(t.MethodToRun);
            a.Start();
        }
    }

    private void Test1()
    {
        MessageBox.Show("Test1 started");
    }

    private void Test2()
    {
        MessageBox.Show("Test2 started");
    }

}

public class MethodInfo
{
    public string MethodName;
    public Action MethodToRun;

    public override string ToString()
    {
        return MethodName;
    }

}
0 голосов
/ 03 января 2011

Спасибо всем за помощь. Вот ответ для всех людей, которые заботятся. Вы создаете начало потока делегата. Я узнал об этом после прочтения этих двух постов: http://bytes.com/topic/net/answers/410294-using-reflection-multithreading http://www.pelennorfields.com/matt/2009/03/13/createdelegate-error-binding-to-target-method/

Этот метод принимает отраженное значение списка метода MethodInfo GetMethod и вызывает соответствующий метод Instance в новом потоке. Поток сделан глобальным, чтобы позволить пользователю контролировать длительный метод. Этот метод хорош тем, что он допускает динамический класс методов экземпляров, без перекомпиляции всего кода программы.

        public void GetTest()
    {
        _t = testListBox.SelectedIndex;

        if (_t < 0)
            return;

        _v = testListBox.SelectedValue;

        method = _v as MethodInfo;


        if (method == null)
            return;

        _selectedMethod = method.Name;

        MessageBox.Show(_selectedMethod.ToString());

        counter++;


        ThreadStart ts = (ThreadStart)Delegate.CreateDelegate(typeof(ThreadStart), this, method, true);

        Thread UIthread = new Thread(ts);
        UIthread.Start();
        _UIthread = UIthread; 
    }
0 голосов
/ 02 января 2011

Вы можете выполнить выражение lamdba в вашем новом потоке.

Я не уверен, имеете ли вы дело со статическими или экземплярами методов.Если ваши методы статичны, вам не нужно создавать экземпляр объекта:

method = _v as MethodInfo;
object[] parameters = null;

Thread UIthread = new Thread(() =>
{
    object obj = null;

    if (!method.IsStatic)
    {
        obj = Activator.CreateInstance(method.DeclaringType);
    }

    method.Invoke(obj, parameters);
});

UIthread.Start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...