Cross-method threading (?)

0
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace ShutDown
{
    public partial class Background : Form
    {
        public void BackgroundAnimation()
        {
            this.Opacity = 0.00;

            for (double i = 0.00; i < 0.51; i = i + 0.01)
            {
                this.Opacity = i;

            }
        }

        public Background()
        {
            InitializeComponent();

            // Maximize the window
            this.WindowState = FormWindowState.Maximized;

            // Animate background
            Thread Animation = new Thread(BackgroundAnimation);
            Animation.Start();
        }
    }
}

To kawałek kodu, którym się posługuje. Jednak przy debudowaniu dostaję błąd:

Cross-thread operation not valid: Control 'Background' accessed from a thread other than the thread it was created on.

Jestem początkujący i nie bardzo rozumiem czego chce ode mnie debugger. Przy normalnym wywołaniu funkcji BackgroundAnimation() nie ma problemów, zaś przy używaniu threadingu pojawia się taki komunikat.

0

http://www.codeproject.com/csharp/workerthread.asp

.NET allows you to call System.Windows.Forms.Control functions only from the thread in which the control was created. To run them from another thread we need to use the Control.Invoke (synchronous call) or Control.BeginInvoke (asynchronous call) functions. For tasks like showing database records we need Invoke.

0

Nie mój poziom niestety. Przyda się kiedyś, dzięki.

0

Przestan sie mazac, chlopaki nie placza

    public partial class Form1 : Form
    {
        public delegate void SetOpacityDelegate();

        public Form1()
        {
            InitializeComponent();

            // Maximize the window
            this.WindowState = FormWindowState.Maximized;

            // Animate background
            Thread Animation = new Thread(BackgroundAnimation);
            Animation.Start();
        }

        public void BackgroundAnimation()
        {
            for (double i = 0.00; i < 0.51; i = i + 0.01)
            {
                this.Invoke(new SetOpacityDelegate(delegate { this.Opacity = i; }));
            }
        }
    }

Pewnie ktos potrafi to zrobic estetyczniej ale to powinno dzialac.

0

To nie to, że 'nie umiem i już', ale przygodę z c# dopiero zaczynam, a to, co znalazłem w sieci nt. trochę mnie przytłoczyło. :P

Sprawdzę wieczorem czy działa, dzięki za pomoc!

0

to nie jest takie trudne jak by sie zdawalo,
na stronach msdn-u jest dosyc dobrze to opisane wiec mozesz tam zajzec.
w pliku pomocy visuala tez jest to o ile mi sie zdaje

0

Dwa zdania wyjasnienia: operacje na formie musza byc odpalone na watku formy... i to np uzyskasz przez invoke'a :)

0

Dzięki za wyjaśnienia, doceniam. :)

Czy ma znaczenie to, że przeniosłem się z WindowForms na WPF? Przy debudowaniu dostaję teraz 'The name 'invoke' does not exist in the current context'. Powinienem coś najpierw zadeklarować? Kod prawie taki sam jak przedstawił to Wolverine.

1 użytkowników online, w tym zalogowanych: 0, gości: 1