Ayırmak için bir saniyeden bir iki saniyeye kadar alabilen bir nesneyim var. Bunun nedeni, kurucunun birkaç kilobayttan birkaç megabayt olabilen bir web servisinden veri alması ve kullanıcının bağlantı hızına bağlı olarak performansının büyük ölçüde değişmesidir. Bu nedenle, ilerleme bildirimini ele alacak olayları koymak istiyorum. İşte Yapıcılarda Etkinlik İşleyicileri - Mümkün veya Bile Akıllı mı?
sorum şu: Ben işleyicileri yapıcı olayı koyabilir miyim ya gerektiği eylem bu tür bir Yük yöntemi ile yapılabilir? Ben her zaman boş olan kurucusuna olay işleyicileri kravat çalıştığınızda Ancak çağrılanpublic class MyObject { public event EventHandler<UpdateLoadProgressEventArgs> UpdateLoadProgress; public MyObject(int id) { Background worker bgWorker = new BackgroundWorker(); bgWorker.DoWork += delegate(object s, DoWorkEventArgs args) { //load data and update progress incrementally UpdateLoadProgress(this, new UpadteLoadProgressEventArgs(progressValue)); Result = someValue; } bgWorker.RunWorkAsync(); } public int Result { get; set; } }
: Örneğin
MyObject o = new MyObject(1);
o.UpdateLoadProgress += new EventHandler<EventArgs>(o_UpdateLoadProgress);
bu olmuyorsa varsayalım telden dolayı kurucudan sonra olayları yukarı. Gördüğüm tek alternatif, kurucunun çalışmasını yapan bir Load yöntemi oluşturuyor. Dezavantajı, bu sınıfı kullanan herkesin, Sonucu (veya başka bir özelliği) erişmeye çalışmadan önce Yük'ü çağırması gerektiğini bilmesidir.
DÜZENLEME: İşte nihai çözümdür:
MyObjectBuilder Sınıf
public class MyObjectBuilder
{
public event ProgressChangedEventHandler ProgressChanged;
public MyObject CreateMyObject()
{
MyObject o = new MyObject();
o.Load(ProgressChanged);
return o;
}
}
MyObject Sınıf
public class MyObject
{
public int Result { get; set;}
public void Load(ProgressChangedEventHandler handler)
{
BackgroundWorker bgWorker = new BackgroundWorker();
bgWorker.WorkerReportsProgress = true;
bgWorker.ProgressChanged += handler;
bgWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(10);
Result = i;
bgWorker.ReportProgress(i);
}
};
bgWorker.RunWorkerAsync();
}
}
Programı Sınıf
class Program
{
static void Main(string[] args)
{
MyObjectBuilder builder = new MyObjectBuilder();
builder.ProgressChanged += new ProgressChangedEventHandler(builder_ProgressChanged);
MyObject o = builder.CreateMyObject();
Console.ReadLine();
}
static void builder_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Console.WriteLine(e.ProgressPercentage);
}
}
Genelde bir kurucunun veri yüklemesi için kötü bir fikir olduğunu anladım. Er ya da geç pişman olacaksınız - ve eğer birim testi yapıyorsanız, "daha erken" olacaktır. –