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();