如何解决警告 CS4014:未等待呼叫
How to solve warning CS4014: Call is not awaited
我正在尝试设置一个系统,如果设备的 USB 电缆断开连接,我的应用程序将无法运行。为此,如果用户激活了一个功能,我不会让应用程序崩溃,而是在等待电缆重新连接时将用户带到加载屏幕。
我已经做了很多研究,但没有真正找到解决这个错误的解决方案,并允许我让它按我希望的方式工作。这是我的代码:
public async Task WaitingPort()
{
var controllerPort = await this.ShowProgressAsync("Seeking device", " "); //Warning starts here
controllerPort.SetIndeterminate();
await Task.Run(() =>
{
while (port is null)
{
port = CheckPort();
controllerPort.SetMessage("please plub USB");
}
});
await controllerPort.CloseAsync();
}
private SerialPort CheckPort()
{
string[] listPort = SerialPort.GetPortNames();
foreach(string namePort in listPort)
{
SerialPort port = new SerialPort(namePort, 9600);
if (!port.IsOpen)
{
try
{
port.Open();
port.ReadTimeout = 1500;
string data = port.Readline();
if (data.Substring(0, 1) == "A")
{
port.ReadTimeout = 200;
port.Write("777"); // to make it stop sending "A"
return port;
}
else
{
port.Close();
}
}
catch (Exception e1)
{
port.Close();
}
}
}
return null;
}
public MainWindow()
{
WaitingPort(); //WARNING CS4014
...
}
private async void Button_ClickOpen(object sender, RoutedEventArgs e)
{
var controllerPort = await this.ShowProgressAsync("Please wait", " ");
controllerPort.SetIndeterminate();
await Task.Run(() =>
{
try
{
blabla
}
catch (Exception)
{
WaitingPort(); //WARNING CS4014
}
}
}
我已经尝试过多种解决方案...:[=12=]
Turning my Void into a Task
_ = WaitingPort(); // hide the error without solving it
WaitingPort().Wait(); // same case here, hiding but not solving
await MyAsyncMethod().ConfigureAwait(false); // same case here, hiding but not solving
目前WaitingPort方法只在启动时起作用,否则会发出警告。
我不会像堆栈上的每个解决方案那样尝试隐藏、忽略、抑制或任何警告,而是解决它,使其工作。你们有什么想法吗?
我真的希望我的 ShowProgressAsync 在被其他非异步方法调用时能够正常工作
我在 C# 方面还不是很有经验,也许我缺少一些基础知识?
我会使用这样的代码来解决这两个问题:
public MainWindow()
{
this.Initialization = this.WaitingPort();
...
}
public Task Initialization { get; }
private async void Button_ClickOpen(object sender, RoutedEventArgs e)
{
await this.Initialization; // Do this in every public method and non-public if they're called out of an 'event'
var controllerPort = await this.ShowProgressAsync("Please wait", " ");
controllerPort.SetIndeterminate();
await Task.Run(async () =>
{
try
{
blabla
}
catch (Exception)
{
await WaitingPort();
}
}
}
这就是Stephen Cleary传播的方式。
我正在尝试设置一个系统,如果设备的 USB 电缆断开连接,我的应用程序将无法运行。为此,如果用户激活了一个功能,我不会让应用程序崩溃,而是在等待电缆重新连接时将用户带到加载屏幕。
我已经做了很多研究,但没有真正找到解决这个错误的解决方案,并允许我让它按我希望的方式工作。这是我的代码:
public async Task WaitingPort()
{
var controllerPort = await this.ShowProgressAsync("Seeking device", " "); //Warning starts here
controllerPort.SetIndeterminate();
await Task.Run(() =>
{
while (port is null)
{
port = CheckPort();
controllerPort.SetMessage("please plub USB");
}
});
await controllerPort.CloseAsync();
}
private SerialPort CheckPort()
{
string[] listPort = SerialPort.GetPortNames();
foreach(string namePort in listPort)
{
SerialPort port = new SerialPort(namePort, 9600);
if (!port.IsOpen)
{
try
{
port.Open();
port.ReadTimeout = 1500;
string data = port.Readline();
if (data.Substring(0, 1) == "A")
{
port.ReadTimeout = 200;
port.Write("777"); // to make it stop sending "A"
return port;
}
else
{
port.Close();
}
}
catch (Exception e1)
{
port.Close();
}
}
}
return null;
}
public MainWindow()
{
WaitingPort(); //WARNING CS4014
...
}
private async void Button_ClickOpen(object sender, RoutedEventArgs e)
{
var controllerPort = await this.ShowProgressAsync("Please wait", " ");
controllerPort.SetIndeterminate();
await Task.Run(() =>
{
try
{
blabla
}
catch (Exception)
{
WaitingPort(); //WARNING CS4014
}
}
}
我已经尝试过多种解决方案...:[=12=]
Turning my Void into a Task
_ = WaitingPort(); // hide the error without solving it
WaitingPort().Wait(); // same case here, hiding but not solving
await MyAsyncMethod().ConfigureAwait(false); // same case here, hiding but not solving
目前WaitingPort方法只在启动时起作用,否则会发出警告。
我不会像堆栈上的每个解决方案那样尝试隐藏、忽略、抑制或任何警告,而是解决它,使其工作。你们有什么想法吗?
我真的希望我的 ShowProgressAsync 在被其他非异步方法调用时能够正常工作
我在 C# 方面还不是很有经验,也许我缺少一些基础知识?
我会使用这样的代码来解决这两个问题:
public MainWindow()
{
this.Initialization = this.WaitingPort();
...
}
public Task Initialization { get; }
private async void Button_ClickOpen(object sender, RoutedEventArgs e)
{
await this.Initialization; // Do this in every public method and non-public if they're called out of an 'event'
var controllerPort = await this.ShowProgressAsync("Please wait", " ");
controllerPort.SetIndeterminate();
await Task.Run(async () =>
{
try
{
blabla
}
catch (Exception)
{
await WaitingPort();
}
}
}
这就是Stephen Cleary传播的方式。