2015-07-23 5 views
0

У меня есть приложение с графическим интерфейсом enter image description hereКак использовать функцию в другом классе C#

я поставил функцию checkproxy() в Form1.cs он работает правильно, и я хочу переместить функцию checkproxy() в другой класс, но если я ставлю checkproxy() в другом классе это будет ошибка с Invoke и richTextBox3

namespace test3 
{ 
public partial class Form1 : Form 
{ 
    public bool continueThreads = false; 
    string[] proxyList = null; 
    List<Thread> threadList = new List<Thread>(); 
    int proxynum = 0; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
      int n = (int)numericUpDown1.Value; 
      Thread[] tl = new Thread[n + 1]; 
      threadList = tl.ToList(); 
      for (int i = 0; i <= n; i++) 
      { 
       threadList[i] = new Thread(new ThreadStart(checkproxy)); 
      } 
      for (int i = 0; i <= n; i++) 
      { 
       threadList[i].Start(); 
      } 
      continueThreads = true; 
      proxyList = richTextBox1.Lines; 
    } 
    public void checkproxy() 
    { 
     while (continueThreads) 
     { 

      if (proxynum >= proxyList.Length) 
      { 
       continueThreads = false; 
      } 
      if (proxynum < proxyList.Length) 
      { 
       string proxy = proxyList[proxynum]; 
       proxynum += 1; 
       string info = ""; 
       try 
       { 
        Thread.Sleep(1000); 
        info += "Live || " + proxy + Environment.NewLine; 
        this.Invoke(new Action(() => richTextBox3.Text += info)); 
       } 
       catch 
       { 

       } 
      } 
     } 
    } 
} 
} 

это ошибка скриншоте enter image description here

+0

'будет ошибка с Invoke и richTextBox3' Затем реорганизуйте свой код, переместите этот код на какую-нибудь другую функцию и верните значение' checkproxy'. – EZI

+0

не могли бы вы опубликовать снимок экрана об ошибке, я не понял, что происходит не так. –

+0

Каково отношение нового местоположения к старому? Это звучит как некоторые проблемы с видимостью. – leigero

ответ

3

Ваш метод checkproxy использует Form1 членов класса (continueThreads, proxynum и другие).

Если вы действительно хотите переместить его за пределы этого класса (я не уверен, что это хорошая идея, так как этот метод очень тесно связан с вашим классом) - вам нужно реорганизовать этот метод и передать все члены класса, которые он использует в качестве входных параметров, таких как метод

public void checkproxy(bool continueThreads.....) 
3

поскольку this находится в первоначальном контексте System.Windows.Forms.Form. Чтобы иметь возможность обновлять интерфейс от Invoke из другой задачи потока/асинхронизации, вам нужно использовать его (как вы правильно сделали в своем исходном коде).

Но как только вы переместите функцию в отдельный класс, не существует более понятие Conntrol или Form там, так this является сам класс, который не имеет Invoke реализацию.

Одно из возможных решений: вам необходимо реорганизовать свой метод таким образом, чтобы он мог вызвать функцию Form, которая внутренне вызывает Invoke.