새 스레드에서 간단한 코드를 어떻게 실행합니까? 코드가 있습니다. 현재

GUI가 아닌 다른 스레드에서 실행 해야하는 약간의 코드가 있습니다. 현재 코드가 실행되는 동안 (10 초 정도) 양식이 정지됩니다.

이전에 새 스레드를 만든 적이 없다고 가정합니다. C #에서 .NET Framework 2.0 이상을 사용하는 방법에 대한 간단한 / 기본 예는 무엇입니까?



답변

읽기 시작하기 좋은 곳은 Joe Albahari 입니다.

자신 만의 스레드를 만들고 싶다면 다음과 같이 간단합니다.

using System.Threading;
new Thread(() =>
{
    Thread.CurrentThread.IsBackground = true;
    /* run your code here */
    Console.WriteLine("Hello, world");
}).Start();

답변

BackgroundWorker 최선의 선택 인 것 같습니다.

여기에 최소한의 예가 있습니다. 단추를 클릭하면 백그라운드 작업자가 백그라운드 스레드에서 작업을 시작하고 진행 상황을 동시에보고합니다. 작업이 완료된 후에도보고합니다.

using System.ComponentModel;
...
    private void button1_Click(object sender, EventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();

        // this allows our worker to report progress during work
        bw.WorkerReportsProgress = true;

        // what to do in the background thread
        bw.DoWork += new DoWorkEventHandler(
        delegate(object o, DoWorkEventArgs args)
        {
            BackgroundWorker b = o as BackgroundWorker;

            // do some simple processing for 10 seconds
            for (int i = 1; i <= 10; i++)
            {
                // report the progress in percent
                b.ReportProgress(i * 10);
                Thread.Sleep(1000);
            }

        });

        // what to do when progress changed (update the progress bar for example)
        bw.ProgressChanged += new ProgressChangedEventHandler(
        delegate(object o, ProgressChangedEventArgs args)
        {
            label1.Text = string.Format("{0}% Completed", args.ProgressPercentage);
        });

        // what to do when worker completes its task (notify the user)
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
        delegate(object o, RunWorkerCompletedEventArgs args)
        {
            label1.Text = "Finished!";
        });

        bw.RunWorkerAsync();
    }

노트 :

  • 단순화를 위해 C #의 익명 메소드를 사용하여 모든 것을 단일 메소드에 넣었지만 항상 다른 메소드로 가져올 수 있습니다.
  • 이 업데이트에서 GUI에 안전
    ProgressChanged또는
    RunWorkerCompleted핸들러. 그러나 GUI를 업데이트 DoWork
    하면에서 발생
    InvalidOperationException합니다.

답변

ThreadPool.QueueUserWorkItem는 뭔가 간단한 꽤 이상적입니다. 유일한주의 사항은 다른 스레드에서 컨트롤에 액세스하는 것입니다.

System.Threading.ThreadPool.QueueUserWorkItem(delegate {
    DoSomethingThatDoesntInvolveAControl();
}, null);

답변

빠르고 더럽지 만 작동합니다.

상단에 사용 :

using System.Threading;

간단한 코드 :

static void Main( string[] args )
{
    Thread t = new Thread( NewThread );
    t.Start();
}

static void NewThread()
{
    //code goes here
}

방금 이것을 exmaple을위한 새로운 콘솔 응용 프로그램으로 던졌습니다.


답변

다른 옵션은 다음과 같습니다.

Task.Run(()=>{
//Here is a new thread
});

답변

BackgroundWorker 클래스를 사용해보십시오 . 실행할 대상을 위임하고 작업이 완료되면 알림을받습니다. 내가 링크 한 MSDN 페이지에 예가 있습니다.


답변

가치를 얻고 싶다면 :

var someValue;

Thread thread = new Thread(delegate()
            {
                //Do somthing and set your value
                someValue = "Hello World";
            });

thread.Start();

while (thread.IsAlive)
  Application.DoEvents();