fix: ui process blocked by sendText/sendFile

This commit is contained in:
2026-02-05 03:08:18 +08:00
parent c35864d02a
commit 258ed65d63
3 changed files with 62 additions and 53 deletions

View File

@@ -21,7 +21,7 @@ import (
func (s *Service) SendFiles(target *discovery.Peer, targetIP string, filePaths []string) { func (s *Service) SendFiles(target *discovery.Peer, targetIP string, filePaths []string) {
for _, filePath := range filePaths { for _, filePath := range filePaths {
go s.SendFile(target, targetIP, filePath) s.SendFile(target, targetIP, filePath)
} }
} }
@@ -30,13 +30,6 @@ func (s *Service) SendFile(target *discovery.Peer, targetIP string, filePath str
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
s.cancelMap.Store(taskID, cancel) s.cancelMap.Store(taskID, cancel)
// 任务结束后清理 ctx
defer func() {
s.cancelMap.Delete(taskID)
cancel()
s.NotifyTransferListUpdate()
}()
file, err := os.Open(filePath) file, err := os.Open(filePath)
if err != nil { if err != nil {
slog.Error("Failed to open file", "path", filePath, "error", err, "component", "transfer-client") slog.Error("Failed to open file", "path", filePath, "error", err, "component", "transfer-client")
@@ -63,24 +56,33 @@ func (s *Service) SendFile(target *discovery.Peer, targetIP string, filePath str
s.StoreTransferToList(task) s.StoreTransferToList(task)
askResp, err := s.ask(ctx, target, targetIP, task) go func() {
if err != nil { // 任务结束后清理 ctx
if errors.Is(err, context.Canceled) { defer func() {
task.Status = TransferStatusCanceled s.cancelMap.Delete(taskID)
} else { cancel()
// 如果请求发送失败,更新状态为 Error s.NotifyTransferListUpdate()
task.Status = TransferStatusError }()
task.ErrorMsg = fmt.Sprintf("Failed to connect to receiver: %v", err)
askResp, err := s.ask(ctx, target, targetIP, task)
if err != nil {
if errors.Is(err, context.Canceled) {
task.Status = TransferStatusCanceled
} else {
// 如果请求发送失败,更新状态为 Error
task.Status = TransferStatusError
task.ErrorMsg = fmt.Sprintf("Failed to connect to receiver: %v", err)
}
return
} }
return if askResp.Accepted {
} s.processTransfer(ctx, askResp, target, targetIP, task, file)
if askResp.Accepted { } else {
s.processTransfer(ctx, askResp, target, targetIP, task, file) // 接收方拒绝
} else { task.Status = TransferStatusRejected
// 接收方拒绝 return
task.Status = TransferStatusRejected }
return }()
}
} }
func (s *Service) SendFolder(target *discovery.Peer, targetIP string, folderPath string) { func (s *Service) SendFolder(target *discovery.Peer, targetIP string, folderPath string) {
@@ -147,13 +149,6 @@ func (s *Service) SendText(target *discovery.Peer, targetIP string, text string)
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
s.cancelMap.Store(taskID, cancel) s.cancelMap.Store(taskID, cancel)
// 任务结束后清理 ctx
defer func() {
s.cancelMap.Delete(taskID)
cancel()
s.NotifyTransferListUpdate()
}()
r := bytes.NewReader([]byte(text)) r := bytes.NewReader([]byte(text))
task := NewTransfer( task := NewTransfer(
taskID, taskID,
@@ -168,24 +163,33 @@ func (s *Service) SendText(target *discovery.Peer, targetIP string, text string)
s.StoreTransferToList(task) s.StoreTransferToList(task)
askResp, err := s.ask(ctx, target, targetIP, task) go func() {
if err != nil { // 任务结束后清理 ctx
if errors.Is(err, context.Canceled) { defer func() {
task.Status = TransferStatusCanceled s.cancelMap.Delete(taskID)
} else { cancel()
// 如果请求发送失败,更新状态为 Error s.NotifyTransferListUpdate()
task.Status = TransferStatusError }()
task.ErrorMsg = fmt.Sprintf("Failed to connect to receiver: %v", err)
askResp, err := s.ask(ctx, target, targetIP, task)
if err != nil {
if errors.Is(err, context.Canceled) {
task.Status = TransferStatusCanceled
} else {
// 如果请求发送失败,更新状态为 Error
task.Status = TransferStatusError
task.ErrorMsg = fmt.Sprintf("Failed to connect to receiver: %v", err)
}
return
} }
return if askResp.Accepted {
} s.processTransfer(ctx, askResp, target, targetIP, task, r)
if askResp.Accepted { } else {
s.processTransfer(ctx, askResp, target, targetIP, task, r) // 接收方拒绝
} else { task.Status = TransferStatusRejected
// 接收方拒绝 return
task.Status = TransferStatusRejected }
return }()
}
} }
// ask 向接收端发送传输请求 // ask 向接收端发送传输请求

View File

@@ -34,12 +34,10 @@ func (s *Service) LoadHistory() {
return return
} }
defer file.Close() defer file.Close()
var history []Transfer var history []*Transfer
err = json.NewDecoder(file).Decode(&history) err = json.NewDecoder(file).Decode(&history)
if err != nil { if err != nil {
return return
} }
for _, item := range history { s.StoreTransfersToList(history)
s.StoreTransferToList(&item)
}
} }

View File

@@ -96,6 +96,13 @@ func (s *Service) CancelTransfer(transferID string) {
} }
} }
func (s *Service) StoreTransfersToList(transfers []*Transfer) {
for _, transfer := range transfers {
s.transferList.Store(transfer.ID, transfer)
}
s.NotifyTransferListUpdate()
}
func (s *Service) StoreTransferToList(transfer *Transfer) { func (s *Service) StoreTransferToList(transfer *Transfer) {
s.transferList.Store(transfer.ID, transfer) s.transferList.Store(transfer.ID, transfer)
s.NotifyTransferListUpdate() s.NotifyTransferListUpdate()