Обновление1:
Подробнее: потоки 1 и 2 должны быть постоянно активны. Поток 1 обновляет свой графический интерфейс и выполняет HTTP POST. Поток 2 использует HTTPListener для входящих HTTP-сообщений POST и передает эти данные потоку 1. Таким образом, графический интерфейс должен отображаться с текущими значениями текстового поля и обновляться, когда поток 2 предоставляет данные. Позволит ли подход Servy или другой подход обоим потокам выполнять свою работу одновременно? Похоже, что основной поток ждет, пока поток 2 завершит свою работу. Затем он берет prepWork и работает с ним. Я кодировал пример Servy, но не смог найти определение для Run() с классом Task. В его библиотеке нет такого метода. Я использую Net 4.0 на VS 2010. Можно ли использовать эквивалентный метод? Start() тоже не скомпилировался, и я понимаю, что вы можете запустить задачу только один раз. Спасибо за любую дополнительную помощь, которой вы можете поделиться.
Оригинальный вопрос:
Я протестировал код, который успешно запускает мое событие и обновляет текстовое поле моего графического интерфейса в обработчике событий, если событие запускается в том, что я понимаю как поток 1 пользовательского интерфейса. Когда я пытаюсь вызвать метод Fire() потока 1 из мой независимый метод Thread 2 PrepareDisplay(), Fire() вызывается и, в свою очередь, запускает событие. Я добавил некоторый потокобезопасный код вызова (по образцу учебника MSDN по потокобезопасности в WinForms), но обработчик событий по-прежнему не обновляет текстовое поле. При выполнении кода кажется, что InvokeRequired имеет значение false. Моя конечная цель - передать данные из потока 2 в поток 1 пользовательского интерфейса и обновить текстовые поля новыми данными. Я не понимаю, почему потокобезопасный код не позволяет этого. Может ли кто-нибудь помочь мне понять это лучше, и что я пренебрег? Ниже приведен код:
Большое Вам спасибо,
namespace TstTxtBoxUpdate
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Aag_PrepDisplay aag_Prep1 = new Aag_PrepDisplay();
Thread AagPrepDisplayThread = new Thread(new ThreadStart(aag_Prep1.PrepareDisplay));
AagPrepDisplayThread.Start();
while(!AagPrepDisplayThread.IsAlive)
;
Thread.Sleep(1000);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new SetOperation());
}
}
}
namespace TstTxtBoxUpdate
{
// Thread 1: UI
public partial class SetOperation : Form
{
private string text;
public event Action<object> OnChDet;
delegate void SetTextCallback(string text);
private Thread demoThread = null;
public SetOperation()
{
InitializeComponent();
OnChDet += chDetDisplayHandler;
}
public void FireEvent(Aag_PrepDisplay aagPrep)
{
OnChDet(mName);
}
private void chDetDisplayHandler(object name)
{
this.demoThread = new Thread(new ThreadStart(this.ThreadProcSafe));
this.demoThread.Start();
}
private void ThreadProcSafe()
{
this.SetText("402.5");
}
private void SetText(string text)
{
if(this.actFreqChan1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.actFreqChan1.Text = text;
}
}
}
}
namespace TstTxtBoxUpdate
{
// Thread 2: Data prepare
public class Aag_PrepDisplay
{
#region Fields
private Aag_PrepDisplay mAagPrep;
#endregion Fields
#region Properties
public Aag_PrepDisplay AagPrepDisp;
public Aag_PrepDisplay AagPrep
{
get { return mAagPrep; }
set { mAagPrep = value; }
}
#endregion Properties
#region Methods
public void PrepareDisplay()
{
mAagPrep = new Aag_PrepDisplay();
SetOperation setOp1 = new SetOperation();
setOp1.FireEvent(mAagPrep); // calls Thread 1 method that will fire the event
}
#endregion Methods
}
}