2010-03-22 11 views
6

CÂU HỎI: Làm cách nào tôi có thể lên lịch các tác vụ trong ứng dụng WinForms? Đó là (a) cách tiếp cận tốt nhất/lớp/các phương thức .NET để sử dụng (b) là gì nếu có một thành phần nguồn mở thực hiện tốt điều này.Tôi làm cách nào để lên lịch tác vụ trong ứng dụng WinForms?

BỐI CẢNH:

  • Winforms ứng dụng (NET v3.5, C#, VS2008)
  • Tôi giả định tôi sẽ chạy các ứng dụng winforms mọi khi, và chỉ giảm thiểu để khay hệ thống khi không sử dụng
  • Muốn có một cách tiếp cận đơn giản (không muốn tham gia vào dịch vụ riêng biệt chạy giao diện người dùng ứng dụng winforms, v.v.)
  • Muốn có thể cho phép người dùng chọn tần suất lên lịch đồng bộ (ví dụ hàng giờ, hàng ngày - chọn thời gian, v.v.)
  • Khả năng vào những thời điểm khi các đám cháy lên lịch để chạy một đoạn mã (giả định nó có thể được bao bọc như một nhiệm vụ BackgroundWorker ví dụ)
  • Các ứng dụng luôn chạy & xuất hiện trong khay hệ thống

Trả lời

2

Nếu bạn không muốn một dịch vụ Windows thì hãy khởi động ứng dụng bằng cửa sổ i một tùy chọn. bạn có thể sử dụng đoạn mã sau để làm điều đó.

Dim regKey As RegistryKey 
regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True) 
regKey.SetValue(Application.ProductName, Application.ExecutablePath) 
regKey.Close() 

Ý bạn là gì theo lịch biểu đồng bộ hóa? nó là một dịch vụ khác? Sau đó, bạn có thể sử dụng bộ hẹn giờ và sau đó lưu trữ cài đặt người dùng trong tệp xml hoặc DB. Nếu bạn muốn lưu trữ đơn giản thì bạn có thể sử dụng My.Settings.

Chỉnh sửa: Tôi nghĩ cách duy nhất là kiểm tra ngày bắt đầu ứng dụng và sau đó kiểm tra ngày theo định kỳ. Một tùy chọn khác là sử dụng lập lịch tác vụ theo chương trình. Task Scheduler Managed Wrapper là trình bao bọc mã nguồn mở mà bạn có thể dùng thử.

+0

Rất tiếc, việc sử dụng "đồng bộ hóa" của tôi chỉ làm phức tạp mọi thứ. Nó chỉ là một ứng dụng cửa sổ mà người dùng có thể lên lịch một "nhiệm vụ" được chạy định kỳ. Tôi có một cơ sở dữ liệu để có thể lưu trữ dữ liệu ở đó. Vì vậy, việc sử dụng lớp Timer có vẻ là cách để đi, nhưng bạn phải tự kiểm tra ngày/giờ trong mã của mình? (như bộ đếm thời gian không thực sự có bất kỳ lịch dựa trên lịch trình xây dựng trong nó có vẻ) – Greg

+0

Tôi đã chỉnh sửa câu hỏi của tôi. hãy kiểm tra. – Shoban

+0

là có ... điều này (tức là Task Scheduler Managed Wrapper) là loại điều tôi đánh bắt ... bạn có nghĩ đây là cách tiếp cận mạnh mẽ không? Nói cách khác, nó sẽ mạnh mẽ hơn/an toàn để chỉ sử dụng Timer và viết mã kiểm tra ngày/giờ trong ứng dụng của bạn? Bởi mạnh mẽ tôi đoán tôi có nghĩa là tôi có thể giả định rằng nó sẽ làm việc trên bất kỳ máy tính mà không có bất kỳ gottchas (alberit XP, hoặc vista hoặc Windows 7 vv) – Greg

1

Vì vậy, bạn muốn chạy các tác vụ được mã định sẵn trong ứng dụng của bạn chứ không phải các exes bên ngoài?

  • Tạo ứng dụng winforms bằng biểu tượng khay hệ thống. Nếu bạn đang triển khai bằng cách sử dụng nhấp một lần, hãy đặt tên Nhà xuất bản là "Khởi động" để cài đặt phím tắt trong thư mục Khởi động.

  • Sử dụng bộ hẹn giờ để kiểm tra lịch biểu và khởi chạy đề tài nếu cần. Lưu trữ lịch biểu cục bộ của bạn trong một tệp XML để có thể dễ dàng truy vấn LINQ.

  • Bạn đang chạy công việc của mình với Nhân viên nền để quá trình truyền đã được sử dụng.

Tuy nhiên, nếu bạn muốn sử dụng Trình lập lịch tác vụ Windows, có API cho nó. Không phải là một mô-đun duyên dáng nhưng nó hoạt động tốt đủ.

+0

ok - vì vậy cái gì đó như được Timer được đặt trong 5 phút, cứ 5 phút một lần bạn tự kiểm tra (trong mã ứng dụng của riêng bạn) để xem liệu bạn đã vượt qua một điểm được lên lịch tiếp theo chưa? (tức là bạn không thể nói trực tiếp cảnh báo mã của tôi mỗi ngày vào lúc 11 giờ tối chẳng hạn?) – Greg

+1

Sử dụng Bộ hẹn giờ không chính xác, bởi vì bạn đang kiểm tra các khoảng thời gian được xác định trước. Nếu bạn muốn chính xác, hãy sử dụng Windows Task Scheduler: có một API _wrapper_ khá duyên dáng cho nó. –

+0

cảm ơn Maxim - lưu ý câu hỏi của tôi trong câu trả lời khác bắt đầu bằng "Oh ... nếu tôi chạy với ..." - bất kỳ phản hồi nào về lời mời này – Greg

10

Thực tế, có thứ gì đó được tích hợp trực tiếp vào Windows sẽ thực hiện điều đó. Nó được gọi là Windows Task Scheduler! Thay vì có một ứng dụng Windows ngồi và đợi đúng thời điểm để chạy một đoạn mã, bạn nên sử dụng tiện ích hệ thống cơ bản và lưu trữ đoạn mã để chạy trong một tệp thực thi riêng biệt: đó là dễ dàng hơnhiệu quả hơn.

Tôi đã sử dụng Trình lập lịch tác vụ trước đó để định cấu hình ứng dụng của mình để bắt đầu theo lịch trình khá cụ thể. Cách tốt nhất để làm điều đó từ một ứng dụng .NET là sử dụng this handy little library.

Về cơ bản, để thực hiện những gì bạn đã nêu trong câu hỏi của mình, bạn cần tạo một ứng dụng Windows cung cấp GUI. GUI này nên có các tùy chọn điều chỉnh việc tạo và thay đổi Nhiệm vụ. Tác vụ sẽ khởi chạy mã mà bạn phải chạy (bạn nên lưu nó trong một tệp thực thi riêng biệt, có thể là một ứng dụng WinForms trong suốt và do đó ẩn đi.)

Đây là một số mã from the CodeProject article of the library itself minh họa cách tạo một tác vụ:

//Get a ScheduledTasks object for the local computer. 
ScheduledTasks st = new ScheduledTasks(); 

// Create a task 
Task t; 
try { 
    t = st.CreateTask("D checker"); 
} catch (ArgumentException) { 
    Console.WriteLine("Task name already exists"); 
    return; 
} 

// Fill in the program info 
t.ApplicationName = "chkdsk.exe"; 
t.Parameters = "d: /f"; 
t.Comment = "Checks and fixes errors on D: drive"; 

// Set the account under which the task should run. 
t.SetAccountInformation(@"THEDOMAIN\TheUser", "HisPasswd"); 

// Declare that the system must have been idle for ten minutes before 
// the task will start 
t.IdleWaitMinutes = 10; 

// Allow the task to run for no more than 2 hours, 30 minutes. 
t.MaxRunTime = new TimeSpan(2, 30, 0); 

// Set priority to only run when system is idle. 
t.Priority = System.Diagnostics.ProcessPriorityClass.Idle; 

// Create a trigger to start the task every Sunday at 6:30 AM. 
t.Triggers.Add(new WeeklyTrigger(6, 30, DaysOfTheWeek.Sunday)); 

// Save the changes that have been made. 
t.Save(); 
// Close the task to release its COM resources. 
t.Close(); 
// Dispose the ScheduledTasks to release its COM resources. 
st.Dispose(); 

Chú ý: tùy chọn priority không bao giờ làm việc cho tôi, luôn luôn đâm ứng dụng. Tôi khuyên bạn nên bỏ nó ra; thông thường, nó không tạo nên sự khác biệt lớn.

Có nhiều mẫu mã on the article page, một số trong đó cho thấy làm thế nào để thay đổi các thiết lập của một công tác, liệt kê tất cả Scheduled Tasks vv

+0

thansk Maxim - bất kỳ ý tưởng làm thế nào điều này so sánh với việc sử dụng Task Scheduler Quản lý Wrapper mà Shoban đề nghị? http://taskscheduler.codeplex.com/ – Greg

+0

Chỉ cần kiểm tra rằng một trong, nó có vẻ là mới hơn. Ngoài ra, tôi không biết nếu tôi đề nghị làm việc với Task Scheduler 2.0 (Vista & Win7), nhưng tôi sẽ thử nó. –