C # темы и свойства - PullRequest
       28

C # темы и свойства

2 голосов
/ 20 февраля 2009

Я хочу прочитать два свойства из рабочего потока. Вот пример класса:

public partial class FrmPrincipal : Form
{
    private int Height;
    private int Width;
    private string token;

    public FrmPrincipal()
    {
        InitializeComponent();
        ...
    }

    private void menuItem1_Click(object sender, EventArgs e)
    {
        Thread t = new Thread(RequestImage);
        t.Start();
    }

    private void RequestImage()
    {
        try
        {
            ...

            // I want to read these properties
            int alto = this.Height;
            int ancho = this.Width;
            this.token = "...";

            ...
        }
        catch (Exception ex)
        {
            ...
        }
    }

Когда выполняется menuItem1_Click, он запускает новый поток, используя метод RequestImage. В этом методе мне нужно прочитать this.Height и this.Width и обновить значение this.token.

Как я могу это сделать?

Я программирую приложение для Windows Mobile (Compact Framework 2.0).

Спасибо!

Ответы [ 4 ]

4 голосов
/ 20 февраля 2009

Я предлагаю вам захватить их в обработчике кликов и передать их в делегат для нового потока. Это легче всего сделать с помощью лямбда-выражения для фактического ThreadStart:

public partial class FrmPrincipal : Form
{
    private string token;

    public FrmPrincipal()
    {
        InitializeComponent();
        ...
    }

    private void menuItem1_Click(object sender, EventArgs e)
    {
        int width = Width;
        int height = Height;
        Thread t = new Thread(() => RequestImage(width, height));
        t.Start();
    }

    private void RequestImage(int width, int height)
    {
        try
        {
            ...

            int alto = height;
            int ancho = width;
            this.token = "...";

            ...
        }
        catch (Exception ex)
        {
            ...
        }
    }
}
2 голосов
/ 20 февраля 2009

Ваш код как опубликованный не требует ничего дополнительного. Однако он будет работать правильно только в том случае, если никакой другой код не получит доступ к элементу токена во время работы потока. Общий доступ для чтения / записи к переменной должен быть защищен блокировкой. Но это еще не все, вы также должны убедиться, что потоки синхронизированы должным образом, поток, который читает «токен», вероятно, должен подождать, пока рабочий поток обновит значение. Поищите в Google «образец потребительского поведения», и вы найдете множество литературы по этому вопросу.

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

Обратите внимание, что вам также потребуется обработать случай, когда поток пользовательского интерфейса завершается до завершения рабочего потока. Несоблюдение этого требования может привести к исключению ObjectDisposed. Решение Q & D для этого состоит в том, чтобы установить свойство IsBackground потока в True. Убедитесь, что ничего не происходит, когда поток прерывается.

0 голосов
/ 20 февраля 2009

Изменить подпись вашего метода на void RequestImage (состояние объекта) и вызовите t.Start (this) для передачи экземпляра формы в тело потока.

0 голосов
/ 20 февраля 2009

Будет объявлено, что общие переменные изменчивы.

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

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