私は、UI、カスタムクラス、およびスレッドを持っています。私は別のスレッドで完全にカスタムクラスを実行したい。これを行うきれいな方法がありますか?別のスレッドでカスタムクラスのメソッド呼び出しを実行するには?
たとえば、下のメインフォームで、UIが_threadOneClass.Sleepを呼び出すとき、私は生成されたThreadOneに行き、メインスレッドではなくThreadOneでSleepメソッドを呼び出すためのUIが必要です。
基本的に、MyClassのすべてのメソッド呼び出しは、メインスレッドではなく、ThreadOneで実行する必要があります。それはMyClassが独自の「プロセス」上で動作するようなものですが、MainFormから呼び出されることはまだありません。
メインフォームには3つのボタンがあり、ロギングには1つのテキストボックスがあります。
私はThreadクラスを派生させることを考えていましたが、シールされています。だから、派生は間違いなくMicrosoftごとに間違った方法です。
貴重な専門家を助けるか?ここ
ここ出力(MainThread ID = 10、ThreadOne ID = 11)
MyClass instantiated Starting ThreadOne 11-Run.start Sleeping ThreadOne 10-Run.sleep for 3000 'Need this to run on ThreadID 11 10-Run.woke up 'Need this to run on ThreadID 11 Stopping ThreadOne 11-Run.done
あるコードがどのように見えるかです。
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private Thread _threadOneThread;
private MyClass _threadOneClass;
private void btnThreadOneCreate_Click(object sender, EventArgs e)
{
_threadOneClass = new MyClass(this);
_threadOneThread = new Thread(new ThreadStart(_threadOneClass.Run));
_threadOneThread.Start();
}
private void btnThreadOneStop_Click(object sender, EventArgs e)
{
_threadOneClass.IsRunning = false;
}
private void btnThreadOneSleep_Click(object sender, EventArgs e)
{
_threadOneClass.Sleep(3000);
}
public void Log(string txt)
{
MainForm.SetText(txtLog, txt);
}
internal static void SetText(Control ctl, string val)
{
if (ctl.InvokeRequired)
ctl.Invoke((MethodInvoker)delegate() { ctl.Text += Environment.NewLine + val; });
else
ctl.Text += Environment.NewLine + val;
}
}
class MyClass
{
public MyClass(MainForm frm)
{
_mainForm = frm;
}
private MainForm _mainForm;
public bool IsRunning = true;
public void Run()
{
_mainForm.Log(Thread.CurrentThread.ManagedThreadId.ToString() + "-Run.start");
while (IsRunning) { }
_mainForm.Log(Thread.CurrentThread.ManagedThreadId.ToString() + "-Run.done");
}
public void Sleep(int milliseconds)
{
_mainForm.Log(Thread.CurrentThread.ManagedThreadId.ToString() + "-Run.sleep for " + milliseconds.ToString());
Thread.Sleep(milliseconds);
_mainForm.Log(Thread.CurrentThread.ManagedThreadId.ToString() + "-Run.woke up");
}
}
なぜ専用のスレッドが必要ですか? Begin/Endデリゲートの標準呼び出しパターンを使用できませんか? – cdhowie
いいえ、それは複雑なシナリオですが、基本的に私はC#winformを呼び出すための別のプロセス用のラッパーを作っています。この個別のプロセスは専用で実行されるため、このラッパーも専用にする必要があります。スレッドがなければ、私のC#winformは簡単に動かなくなりました.. –