所以我理解为什么从异步中返回void通常没有任何意义,但我遇到了一种我认为完全有效的情况.考虑以下人为的例子:
protected override void OnLoad(EventArgs e)
{
if (CustomTask == null)
// Do not await anything, let OnLoad return.
PrimeCustomTask();
}
private TaskCompletionSource<int> CustomTask;
// I DO NOT care about the return value from this. So why is void bad?
private async void PrimeCustomTask()
{
CustomTask = new TaskCompletionSource<int>();
int result = 0;
try
{
// Wait for button click to set the value, but do not block the UI.
result = await CustomTask.Task;
}
catch
{
// Handle exceptions …Run Code Online (Sandbox Code Playgroud) 我目前正在 C# 中设计一个简单的 WinForms UserControl,用户可以在其中将 Excel 文件拖放到面板上,而不是浏览文件。我有它在技术上的工作,但它非常粗糙。
简而言之,对于面板上的 DragEnter 和 DragDrop 事件,我的代码目前看起来像这样(删除了错误处理):
private void dragPanel_DragEnter(object sender, DragEventArgs e)
{
var filenames = (string[])e.Data.GetData(DataFormats.FileDrop, false);
if (Path.GetExtension(filenames[0]) == ".xlsx") e.Effect = DragDropEffects.All;
else e.Effect = DragDropEffects.None;
}
private void dragPanel_DragDrop(object sender, DragEventArgs e)
{
var filenames = (string[])e.Data.GetData(DataFormats.FileDrop, false);
string filename = filenames[0];
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
我试图在拖动文件时显示 Excel 图标,但我所能得到的就是这个东西:

我在网上看到的任何地方(主要是在这个论坛上)都说如果我想要显示特定图标,我需要实现我自己的自定义光标,但老实说,我不相信这一点。我使用完全相同的控件截取了来自不同公司的多个应用程序的屏幕截图(这只是一个子集)。请注意,它们都不是光标,图标只是跟随光标:
Windows资源管理器:
谷歌浏览器:
土坯杂技演员:
微软边缘:
(相同的图标,但 DragDropEffects 可能设置为 None)
所以我的结论是必须有一个通用的 Windows 控件,但它在哪里?不可能所有这些公司只是巧合地构建了完全相同的设计和功能!
任何帮助,将不胜感激!
额外问题:显然在 Windows 10 中,您不允许拖放到以管理员身份运行的程序上,但是 Chrome 绝对可以让您这样做。您可以以管理员身份运行 Chrome 并将文件拖到它上面,没有任何问题。谷歌用什么魔法绕过这个安全功能?我想实现它以及我的控件可能会在以管理员身份运行的程序中使用。
我正在构建一个可供其他开发人员使用的控件,并且在一些地方我有一些事件,开发人员可以订阅这些事件来执行一些可能很长的操作。
我的目标是让他们可以选择使用异步/等待、多线程、后台工作者等,如果他们选择,但仍然能够在事件调用完成之前完成执行。这是一个伪代码示例(我意识到这不能编译,但希望意图很明确):
我的代码:
public event MyEventHandler MyEvent;
private void InvokeMyEvent()
{
var args = new MyEventArgs();
// Keep the UI responsive until this returns
await MyEvent?.Invoke(this, args);
// Then show the result
MessageBox.Show(args.Result);
}
Run Code Online (Sandbox Code Playgroud)
开发者/订阅者的潜在代码:
// Option 1: The operation is very quick,
// so the dev doesn't mind doing it synchronously
private void myForm_MyEvent(object sender, MyEventArgs e)
{
// Short operation, I'll just do it right here.
string result = DoQuickOperation();
e.Result = result;
}
// Option …Run Code Online (Sandbox Code Playgroud)