- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个相当复杂的程序,所以我不会在这里转储整个程序。这是一个简化版本:
class Report {
private BackgroundWorker worker;
public Report(BackgroundWorker bgWorker, /* other variables, etc */) {
// other initializations, etc
worker = bgWorker;
}
private void SomeCalculations() {
// In this function, I'm doing things which may cause fatal errors.
// Example: I'm connecting to a database. If the connection fails,
// I need to quit and have my background worker report the error
}
}
// In the GUI WinForm app:
// using statements, etc.
using Report;
namespace ReportingService {
public partial class ReportingService : Form {
// My background worker
BackgroundWorker theWorker = new BackgroundWorker() {
WorkerReportsProgress = true
};
// The progress changed event
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
// e.UserState and e.ProgressPercentage on some labels, etc.
}
// The do work event for the worker, runs the number crunching algorithms in SomeCalculations();
void worker_DoWork(object sender, DoWorkEventArgs e) {
Report aReport = e.Argument as Report;
aReport.SomeCalculations();
}
// The completed event, where all my trouble is. I don't know how to retrieve the error,
// or where it originates from.
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
// How, exactly, do I get this error message? Who provides it? How?
if (e.Error != null) {
MessageBox.Show("Error: " + (e.Error as Exception).ToString());
}
else if (e.Cancelled) {
MessageBox.Show("Canceled");
}
// operation succeeded
khác {
MessageBox.Show("Success");
}
}
// Initialization of the forml, etc
public ReportingService() {
InitializeComponent();
theWorker.ProgressChanged += worker_ProgressChanged;
theWorker.DoWork += worker_DoWork;
theWorker.RunWorkerCompleted += worker_RunWorkerCompleted;
}
// A button that the user clicks to execute the number crunching algorithm
private void sumButton_Click(object sender, EventArgs e) {
Report myReport = new Report(theWorker, /* some other variables, etc */)
theWorker.RunWorkerAsync(myReport);
}
}
}
这是我的逻辑,如果我以错误的方式进行此操作,请纠正我:
我从 GUI 中抽象出该类,因为它大约有 2000 行,并且需要成为它自己的自包含对象。
我将后台工作人员传递到我的类(class),以便我可以报告我的数字处理进度。
我不知道如何做的是让后台工作人员知道我的类(class)内部发生了错误。为了获得 RunWorkerCompleted 参数作为异常,我的 try/catch block 需要去哪里,我应该在 catch block 中做什么?
感谢您的帮助!
biên tập:
我尝试了以下方法来测试错误处理:
请记住,我损坏了我的数据库连接字符串是为了故意接收一条错误消息。
在我的类里面我这样做:
// My number crunching algorithm contained within my class calls a function which does this:
// try {
using (SqlConnection c = GetConnection()) { // note: I've corrupted the connection string on purpose
c.Open(); // I get the exception thrown here
using (SqlCommand queryCommand = new SqlCommand(query, c)) { /* Loop over query, etc. */ }
c.Close();
}
// } catch (Exception e) { }
1.根据我的理解,未处理的异常被转换为 RunWorkerCompletedEventArgs
của Lỗi
部分?当我尝试这个时,我得到以下信息:
// In my winform application I initialize my background worker with these events:
void gapBW_DoWork(object sender, DoWorkEventArgs e) {
Report aReport = e.Argument as Report;
Report.Initialize(); // takes ~1 minute, throws SQL exception
Report.GenerateData(); // takes around ~2 minutes, throws file IO exceptions
}
void gapBW_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
if (e.Error != null) { // I can't get this to trigger, How does this error get set?
MessageBox.Show("Error: " + (e.Error as Exception).ToString());
}
else if (e.Cancelled) {
MessageBox.Show("Canceled: " + (e.Result).ToString());
}
khác {
MessageBox.Show("Success");
}
}
Visual Studio 说我的应用程序因未处理的异常而因 c.Open()
而阻塞。
2。当我在我的 DoWork 函数中放置一个 try/catch block 时:
void gapBW_DoWork(object sender, DoWorkEventArgs e) {
thử {
Report aReport = e.Argument as Report;
aReport.Initialize(); // throws SQL exceptions
aReport.GenerateData(); // throws IO file exceptions
}
catch (Exception except) {
e.Cancel = true;
e.Result = except.Message.ToString();
}
}
void gapBW_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
if (e.Error != null) { // I can't get this to trigger, How does this error get set?
MessageBox.Show("Error: " + (e.Error as Exception).ToString());
}
else if (e.Cancelled) {
MessageBox.Show("Canceled: " + (e.Result).ToString());
}
khác {
MessageBox.Show("Success");
}
}
我在自动生成的 Application.Run(new ReportingService());
行的 Program.cs 中收到 TargetInvocationException
was unhandled。我在 RunWorkerCompleted 上放置了一个断点,可以看到 e.Cancelled = true、e.Error = null 和 e.UserState = null。 e.Cancelled 中包含的消息只是“操作已被取消”。我想我正在从 e.Result 的无效转换中接收到 TargetInvocationException
(因为它为 null)。不过,我想知道的是,为什么 e.Error 仍然为 null 而 e.Canceled 不包含有关Tại sao操作被取消的任何有用信息?
3。当我尝试在异常捕获时从 DoWork 中设置 e.Canceled = true;
时,我设法触发了我的 TRONG
函数。我以为这是为请求取消作业的用户保留的?我是否从根本上误解了后台工作人员的工作方式?else if (e.Cancelled) {
行>RunWorkerCompleted
câu trả lời hay nhất
我尝试了这个小测试程序,它按预期工作:
void tĩnh Main(chuỗi[] args)
{
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) => { throw new ArgumentException(); };
worker.RunWorkerCompleted += (sender, e) => Console.WriteLine(e.Error.Message);
worker.RunWorkerAsync();
Console.ReadKey();
}
但是当我在调试器中运行该程序时,我还在 throw 语句中收到了有关未处理异常的消息。但我只是再次按下 F5,它继续没有任何问题。
关于C# - 后台 worker ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7115058/
Chi phí xây dựng một hệ thống quản lý phụ trợ từ đầu là rất lớn, do đó, một thư viện thành phần hoàn thiện sẽ được chọn và dựa trên đó, logic nghiệp vụ sẽ được xếp chồng lên nhau. Thư viện thành phần của công ty chúng tôi dựa trên Ant Design. Ant Design chứa một bộ giải pháp phụ trợ hoàn chỉnh, không chỉ
Trong ứng dụng iOS của tôi, tôi có thuộc tính NSDate* được đánh dấu giữ lại. Khi ứng dụng của tôi được kích hoạt lại, giá trị thuộc tính đã được giải phóng. Tôi có hiểu nhầm cách hoạt động của các thuộc tính và quản lý bộ nhớ không và làm cách nào tôi có thể đề phòng điều này? Câu trả lời tốt nhất là hiển nhiên,
Tôi có một ứng dụng WinForms mẫu sử dụng thành phần BackgroundWorker. Nó hoạt động tốt, nhưng khi tôi nhấp vào nút Hủy để hủy chuỗi nền, nó không hủy chuỗi. Khi tôi nhấp vào nút Hủy, nó sẽ gọi
Tôi hiện đang phát triển một ứng dụng khi khởi động sẽ ping máy chủ trả về mã định danh duy nhất cho mỗi thiết bị được kết nối. Thiết bị sẽ truy xuất một trang khác từ máy chủ cứ sau 5 giây cho một bộ dữ liệu khác. ID duy nhất này có thể
Tôi đang phát triển một ứng dụng và khi nó được nhấn ở chế độ nền thông qua nút home, bộ hẹn giờ sẽ bắt đầu và khi ứng dụng quay trở lại nền trước và bộ hẹn giờ đã trôi qua một khoảng thời gian nhất định, nó sẽ được thực thi. Câu hỏi của tôi là khi ứng dụng của tôi chuyển sang nền/nền trước? Có phương pháp đặc biệt hoặc kỹ thuật nào khác không?
Tôi có Chế độ xem bản đồ hầu như không có MKPointAnnotation. Tuy nhiên, mọi thứ đều hoạt động tốt, "nền" của MKPoiintAnnotation của View là "ẩn" và do đó không hoàn toàn "hiển thị". tôi nghĩ
Tôi đang phát triển một ứng dụng dữ liệu quảng cáo trên iOS. Dữ liệu quảng cáo ứng dụng của tôi ở phía trước vẫn ổn. Nhưng tôi muốn quảng cáo dữ liệu đèn hiệu trong phần phụ trợ của iOS. Tôi thiết lập cài đặt ngoại vi nền. và dữ liệu quảng cáoquảng cáoData = [CBAdvertise
Ví dụ: nếu tôi có một tập hợp các hành động mà tôi muốn chạy trong nhân viên nền dựa trên các điều kiện cụ thể, thì tôi có 10 điều kiện if(a) BackgroundWorker doA = new Backgroundworker() if(
Tôi muốn chạy một chức năng một cách độc lập. Từ hàm tôi đã gọi, tôi muốn quay lại mà không cần đợi các hàm khác kết thúc. Tôi đã thử sử dụng threadind, nhưng việc này đang chờ, kết thúc. thread = threading.Thread(target=my
Tôi muốn thực hiện một số tác vụ ngay lập tức khi người dùng trực tuyến, ngay cả khi họ ở chế độ nền. Tôi đang sử dụng lớp Khả năng tiếp cận để kiểm tra internet. Nhưng lớp này không thông báo cho tôi khi tôi ở chế độ nền. Tôi biết ai đó đã hỏi câu hỏi này trước đó nhưng không tìm thấy giải pháp nào
Tôi đang gặp sự cố không liên tục (ôi!) khi tính năng chuyển văn bản thành giọng nói đang phát trong nền do Apple Watch của tôi kích hoạt. Tôi có chế độ nền, lớp AVSession và trình xử lý WatchKitExtensionRequest được thiết lập chính xác.
Tôi có một chương trình khá phức tạp nên tôi sẽ không đưa toàn bộ chương trình vào đây. Đây là phiên bản đơn giản hóa: class Report { Private BackgroundWorker public;
Tôi có một tác vụ đang chạy trong trình xử lý nền. Bằng cách nhấp vào nút bắt đầu, người dùng bắt đầu quá trình và nhận được nút hủy để hủy quá trình. Khi người dùng bấm hủy, tôi muốn hiển thị hộp thông báo "Quá trình chưa hoàn tất, bạn có muốn tiếp tục không". ở đây tôi hy vọng
Tôi có một tập lệnh được mã hóa theo cách sau. Tôi muốn chạy nó dưới dạng tiến trình nền/daemon, nhưng khi tôi khởi động tập lệnh, nếu tôi đóng nó, nó sẽ dừng từ cửa sổ đầu cuối mà chương trình đang chạy. Tôi cần làm gì để chương trình tiếp tục chạy loop do pid = fork do
Tôi đang tạo một ứng dụng sử dụng API nhận dạng hoạt động để theo dõi hoạt động của người dùng ở chế độ nền. Nếu người dùng ở cùng một vị trí trong một khoảng thời gian xác định (ví dụ: 1 giờ), hệ thống sẽ gửi thông báo đẩy cho biết. người dùng đi dạo.
Khi cố gắng gửi yêu cầu nền bằng phương thức dataTaskPublisher của URLSession: URLSession(configuration: URLSessionConfiguration.ba
Khi tôi biên dịch mã này, tôi gặp lỗi của anh ấy, tham chiếu đối tượng được đặt thành null, vị trí lỗi nằm ở Dowork, đối sốtest.valueone = 8 public một phần lớp Form1:
Có cách nào để sử dụng một ứng dụng được thu nhỏ hoặc không hoạt động không? Tôi có thể mở ứng dụng của mình, sau đó mở và sử dụng ứng dụng khác, sau đó nhấn nút để kích hoạt ứng dụng của mình không? Ví dụ: mở ứng dụng của tôi, mở Safari, nhấn nút (F1 hoặc bất kỳ nút nào
Yêu cầu cụ thể của tôi là để một ứng dụng chạy ở chế độ nền, được thông báo rằng màn hình sắp chuyển sang chế độ ngủ hoặc thiết bị đã hoặc sắp đạt đến thời gian chờ không hoạt động - sau đó thức dậy và thực hiện một số đoạn (ngắn gọn) mã số. Tôi đã tìm thấy tài liệu tham khảo ở đây về thông báo về một ứng dụng được đặt ở chế độ nền hoặc bị tạm dừng:
Tôi có một ứng dụng có LSUElement được đặt thành 1. Nó có trình chỉnh sửa tích hợp sẵn, vì vậy tôi muốn ứng dụng xuất hiện trong vòng lặp Cmd+Tab khi trình chỉnh sửa mở. -(void)stepIntoForegro
Tôi là một lập trình viên xuất sắc, rất giỏi!