public class UIAsyncJober
{
public delegate void JoberRunMethodDelegate(UIAsyncJober job);
private static Dictionary<string, UIAsyncJober> jobs = new Dictionary<string, UIAsyncJober>();
private ThreadStart beforeMethod = null;
private ThreadStart runMethod = null;
private ThreadStart doneMethod = null;
private ThreadStart inProcessMethod = null;
private SynchronizationContext context;
private UIAsyncJober()
{
context = SynchronizationContext.Current;
}
public static UIAsyncJober GetJob()
{
return GetJob(Guid.NewGuid().ToString());
}
public static UIAsyncJober GetJob(string id)
{
if (jobs.ContainsKey(id))
{
return jobs[id];
}
var newjob = new UIAsyncJober();
jobs.Add(id, newjob);
return newjob;
}
public UIAsyncJober BeforeStart(ThreadStart method)
{
this.beforeMethod = method;
return this;
}
public UIAsyncJober Run(ThreadStart method)
{
this.runMethod = method;
return this;
}
public UIAsyncJober Done(ThreadStart method) // 还用ThreadStart委托,只是不想再定义一个委托了
{
this.doneMethod = method;
return this;
}
public UIAsyncJober InProcess(ThreadStart method)
{
this.inProcessMethod = method;
return this;
}
public void ReportProcess()
{
context.Send(new SendOrPostCallback(
s =>
{
inProcessMethod();
}
), null);
}
Thread current = null;
public void Start()
{
// stop already running thread
if (current != null)
{
try
{
current.Abort();
}
catch (Exception)
{
// do nothing
}
}
if (beforeMethod != null)
{
beforeMethod();
}
current = new Thread(new ThreadStart(innerRun));
current.Start();
}
public void Abort()
{
if (current != null)
{
try
{
current.Abort();
}
catch (Exception ex)
{
}
}
}
private void innerRun()
{
runMethod();
context.Send(new SendOrPostCallback(
s =>
{
if (doneMethod != null)
{
doneMethod();
}
}
), null);
}
}
UIAsyncJober jober = UIAsyncJober.GetJob("");
jober.Run(delegate()
{
}).Done(delegate()
{
}).InProcess(() =>
{
//显示进度
}).Start();