2011-08-11 34 views
5

Tôi đang tạo một ứng dụng có ứng dụng nền trước (tất nhiên) và cả một PeriodicTask và một ResourceIntensiveTask.Làm cách nào để báo hiệu ScheduledTask từ ứng dụng nền trước trên Windows Phone?

Tôi cần một cách để tắt các tác vụ đã lên lịch nếu người dùng khởi chạy ứng dụng trong khi họ đang chạy.

Tôi không thấy bất kỳ cách nào để thực hiện việc này với Mutexes toàn hệ thống. Lý tưởng nhất là khi các tác vụ nền bắt đầu, một luồng sẽ được tách ra để nghe tín hiệu từ ứng dụng nền trước, và nếu nó nhận được tín hiệu này, nó có thể tắt nhiệm vụ nền một cách sạch sẽ.

Ngoài việc bỏ phiếu (nói thư mục cho một tệp cụ thể), có ai có đề xuất rõ ràng về cách ứng dụng tiền cảnh của tôi có thể báo hiệu tác nhân nền của tôi đóng cửa nếu ứng dụng nền trước được khởi chạy không?

Tôi đang hướng tới ổ cắm, nhưng điều này có vẻ như quá mức cần thiết.

Bối cảnh: Tôi hiện đang sử dụng IsolatedStorage để lưu trữ dữ liệu của mình (không phải cơ sở dữ liệu) - cuối cùng tôi sẽ chuyển sang sử dụng cơ sở dữ liệu.

Ứng dụng nền trước của tôi đồng bộ hóa dữ liệu cục bộ với dịch vụ web và cập nhật giao diện người dùng khi các mục mới được thêm từ dịch vụ web. Tôi sử dụng một tệp mà tôi tìm kiếm để tìm các mục dữ liệu và tôi thêm vào đó các mục mới được đồng bộ hóa.

Tôi muốn các tác nhân nền chạy để thực hiện đồng bộ hóa này trong nền, cập nhật các tệp trong bộ nhớ riêng biệt, bao gồm chỉ mục, v.v. Ngay sau khi tôi khởi động ứng dụng nền trước, tôi cần ứng dụng nền dừng lại rằng nền trước và nền không cố gắng cập nhật cùng một tệp cùng một lúc.

Tôi chỉ cần một quy trình để cập nhật dữ liệu cục bộ tại một thời điểm và tôi cần quy trình nền trước để ngăn chặn quá trình nền.

+0

Tôi muốn đẩy để thiết kế tác nhân của bạn có thể chạy cùng lúc với ứng dụng. Nếu bạn có một ví dụ điển hình về điều gì đó có nghĩa là điều này không thể xảy ra thì tôi muốn được nghe nó. –

+0

Tôi đã thêm một số thông tin cơ bản. Về cơ bản, tôi không thể có cả hai quy trình sửa đổi cùng một tệp cùng một lúc và tôi muốn quy trình nền trước để ngăn chặn quá trình nền. – Damian

Trả lời

5

Không có giải pháp đồng thời cập nhật:

Application (App()):

var m = new Mutex(false, "MyMutex"); 
m.WaitOne(); //When PeriodicTask runs wait 

if(lastSynchronization > 1.Minutes) 
{ 
    //Update only when your PeriodicTask not runs before 
} 

//ApplicationExit  
m.ReleaseMutex(); 

PeriodicTask (Chủ đề chính):

var m = new Mutex(false, "MyMutex"); 
if(m.WaitOne(0)) // Dont wait for the handle 
{ 
    // Synchronization 

    m.ReleaseMutex(); 
} 
else 
{ 
    //Abort task (You dont want to wait for the main application) 
} 

Dừng PeriodicTask khi Ứng dụng khởi động Giải pháp:

ứng dụng (App()):

var m = new Mutex(false, "MyMutex"); 
m.WaitOne(); 

// Application  

m.ReleaseMutex(); 

PeriodicTask (Chủ đề riêng biệt):

var m = new Mutex(false, "MyMutex"); 

while (m.WaitOne(0)) // Check for main application 
{ 
    m.ReleaseMutex(); 
} 

// Abort task 

Tôi nghĩ rằng thats giải pháp tốt nhất với các thành viên có sẵn trong WP7 :

http://msdn.microsoft.com/en-us/library/system.threading.mutex(v=VS.96).aspx

+0

Tôi muốn ứng dụng tiền cảnh của tôi báo hiệu công việc định kỳ của tôi - tác vụ định kỳ có thể đang chạy. Đạt được loại trừ lẫn nhau là đơn giản với mutexes, nhưng tín hiệu ... Tôi không chắc chắn như vậy. – Damian

+0

Khi ứng dụng của bạn bắt đầu nó sẽ có được xử lý và sau đó PeriodicTask của bạn không thể có được xử lý nữa và sẽ rời khỏi vòng lặp while. Thông thoáng? – Skomski

+0

Vì vậy, bạn có một vòng lặp liên tục thu được khóa và phát hành nó? Điều này sẽ ăn cpu, không? – Damian

3

Bạn có thể sử dụng liên lạc Interprocess thông qua Sự kiện được đặt tên.

Bạn có thể báo hiệu tác nhân nền của mình ngay khi bạn mở ứng dụng nền trước.

http://blogs.windows.com/buildingapps/2013/03/27/using-named-events-to-coordinate-foreground-apps-and-background-agents/

+0

Cảm ơn - AFAIK đã không có sẵn khi tôi hỏi câu hỏi ban đầu, nhưng tốt nhất nên biết bây giờ. – Damian

Các vấn đề liên quan