cuốn sách gpt4 ai đã làm

c# - Hành vi không mong muốn trong Enum.GetValues ​​​​hoặc chuyển Enums

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 17:53:52 29 4
mua khóa gpt4 Nike

Tôi đang viết một chương trình tương tác với các chương trình của bên thứ 3. Chương trình của bên thứ 3 này cho phép người dùng tạo các nút chạy bản ghi các bước được thực hiện trong chương trình của bên thứ 3. Nhưng! Các nút này cũng có thể chạy các tệp bó do người dùng xác định. Vì vậy, tôi sử dụng chức năng này để tương tác với chương trình của mình bằng cách tạo tệp và kiểm tra xem các tệp này có tồn tại hay không.

Chương trình của tôi bao gồm hai lớp, Actionlistener và Actionperformer. actionperformer chứa một bảng liệt kê các hành động có thể thực hiện được.

Chức năng đọc trông như thế này:

khoảng trống công khai tĩnh CheckForActions()
{
//Đối với mọi hành động trong Enum
foreach (Hành động ActionPerformer.PossibleActions trong Enum.GetValues(typeof(ActionPerformer.PossibleActions)))
{
//Nếu một file tồn tại có cùng tên với hành động hiện tại
if (File.Exists(_location + action.ToString()))
{
//Xóa "tin nhắn" và tạo một chủ đề mới để thực hiện hành động này.
File.Delete(_location + action);
Chủ đề _t = Chủ đề mới(() =>
{
ActionPerformer mới (hành động);
});

_t.SetApartmentState(ApartmentState.STA);
_t.Start();

// Thêm chủ đề vào danh sách để chúng có thể được nối đúng cách
_list.Add(_t);

//Ghi thông tin vào log
Logger.LogInfo(_t, "Bắt đầu hành động mới: " + action.ToString(), DateTime.Now);
}
}

// Nếu có mục trong danh sách
nếu (_list.Count > 0)
{
// Vứt bỏ mọi luồng sau khi hoàn thành.
foreach (Chủ đề _t trong _list)
{
_t.Join();
Logger.LogInfo("Hoàn tất hành động.", DateTime.Now);
}
_list.Clear();
}
}

Lớp ActionPerformer trông như thế này:
lớp ActionPerformer
{
enum công khai Hành động có thể
{
hành động1,
hành động2,
}

public ActionPerformer(Hành động có thể thực hiện)
{
Logger.LogInfo(action.ToString(), DateTime.Now);
}
}

所以 Khi tôi chạy chương trình với tham số action1 và đọc đầu ra của trình ghi nhật ký, tôi sẽ nhận được kết quả như thế này:
Bắt đầu hành động mới: action1 [13:30:05]
hành động1 [13:30:05]
Hành động kết thúc [13:30:05]

Nhưng lần đầu tiên CheckForActions được gọi, tôi luôn nhận được kết quả này:
Bắt đầu hành động mới: action1 [13:30:05]
action2 [13:30:05] //Để ý xem nó không phải là action1 như thế nào?
Hành động kết thúc [13:30:05]

Lần thứ hai tôi gọi CheckForActions, mọi thứ đều hoạt động như mong đợi...

Có ai biết chuyện gì đang xảy ra không?

câu trả lời hay nhất

Vấn đề không phải là Enum.GetValues , nhưng theo cách giá trị được truyền.

Chủ đề _t = Chủ đề mới(() => 
{
ActionPerformer mới (hành động);
});

Điều này tạo ra một bao đóng mới chứa tham chiếu đến biến hành động (vì vậy khi giá trị "hành động" thay đổi, luồng sẽ thấy giá trị mới.

Bạn có thể chuyển "Hành động" làm tham số cho chuỗi.
Chủ đề _t = Chủ đề mới((hành động) => 
{
ActionPerformer mới (hành động);
});
_t.Start(hành động);

Ngoài ra, hãy sử dụng cách tiếp cận do người khác đề xuất (tạo một biến cục bộ trong phần nội dung của foreach và truy cập nó trong phần đóng.)

Tôi nghĩ Resharper sẽ đưa ra cảnh báo nếu bạn truy cập vào một biến đã sửa đổi khi đóng.

Nhân tiện, đừng đặt dấu gạch dưới trước các biến cục bộ. Nó không tuân theo các tiêu chuẩn C# thông thường.

Về c# - Hành vi không mong muốn trong Enum.GetValues ​​​​hoặc truyền Enums, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/17022986/

29 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress